ElasticSearch笔记

ElasticSearch

  • 基于lucene的搜索服务器(搜索引擎)
  • 分布式多用户
  • 基于Restful
  • java开发
  • ELK日志分析系统
  • 是一个nosql
  • 关系数据搜索缺点

    1. 无法打分
    2. 无法分布式
    3. 无法解析搜索请求
    4. 效率低
    5. 分词

安装

启动

  • elasticsearch

    • ./bin/elasticsearch -d #后端启动
  • elasticsearch-head

    • npm install
    • npm run start

搭建集群

  • 配置master

    • cluster.name: jim
      node.name: master
      node.master: true
      network.host: 127.0.0.1 # 端口保持默认
  • 配置slave

    • cluster.name: jim-slave
      node.name: slave1
      network.host: 127.0.0.1
      http.port: 8200 # 避免和master端口冲突
      
      discovery.zen.ping.unicast.hosts: ["127.0.0.1"] # 查找master

概念

  • 集群:多个节点的集合
  • 节点:集群中的每一个es应用
  • 索引:含有相同属性的文档集合【sql中数据库】

    • 分片:一份数据分几份,默认5,只能在创建的时候指定,不可以后期修改
    • 副本:创建几份数据,默认1
  • 类型:索引可以定义一个或多个类型,文档必须属于一个类型【sql中表】

    • text
    • keyword
    • integer
    • date
  • 文档:可以被索引的基本数据单位【sql中数据】
  • 倒排索引(inverted index)
  • TF-IDF

索引的CRUD操作

  • 创建
PUT lagou
{
    "setting":{
        "index":{
            "number_of_shards":5, # 切片数
            "number_of_replicas":1 # 副本数,可修改
        }
    }
}
# 获取设置
GET lagou/_settings
GET _all/_settings
GET _settings
GET lagou1,lagou2/_settings

#更新配置
PUT lagou/_settings
{
    "number_of_replicas":2
}

#获取索引
GET lagou
GET _all

#添加数据
POST lagou/job/1
{
    "key":"value",
    ...
}

#获取数据
GET lagou/job/1 #指定id存储
GET lagou/job/  #自动生成一个uuid当作id
GET lagou/job/1?_source=key1,key2

#修改数据
PUT lagou/job/1
{
    "key":"value",
    ...
}
POST lagou/job/1/_update
{
    "doc":{
        "key":"value",
        ...
    }
}
# 脚本形式修改数据
POST lagou/job/1/_update
{
    "script":{
        "lang":"painless",
        "inline":"ctx._source.key = value", # 这里的value就可以使用params.key
        "params":{
            "key":value
        }
    }
}

#删除数据
DELETE lagou/job/1
DELETE lagou

批量操作

  • 批量获取
GET lagou/job/_mget
{
    "docs":{
        条件
    }
}

GET lagou/job/1/_mget
{
    "ids":[id1,id2...]
}
  • bulk批量操作
POST _bulk
{"index":{"_index":"lagou","_type":"job","_id":"1"}}
{"title":"批量操作喽","city":"北京"}
{"delete":{"_index":"lagou","_type":"job","_id":"1"}}
{"create":{"_index":"lagou","_type":"job","_id":"1"}}
{"update":{"_index":"lagou","_type":"job","_id":"1"}}

映射(即:创建表字段)

PUT lagou
{
    "mappings":{
        "type_name":{
            "dynamic":false, # 索引固定
            "properties":{
                "name":{
                    "store":true,(是否保存)
                    "type":属性,(即字段类型)
                    "index":"analyzer" #使用分词
                    "analyzer":"ik_max_word"(分析器,即分词类型)
                },
                "age":{
                    "store":true,
                    "type":属性(如果是keywork则不会被分词)
                },
                "date":{
                    "store":true,
                    "type":date,
                    "format":"yy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
                }
                ...
            }
        }
    }
}

查询

基本查询

  • match查询
# 通过id查询
GET lagou/job/id
# 条件查询
GET lagou/job/_search # 可以使用post和get两种方式,建议使用post
{
    "stored_fields":[字段1,字段2...], # 指定返回的字段
    "query":{
        "match":{ # "match_all":{}全部查询 match_phrase:{}完全匹配查询
            "字段":内容
            ...
        }
    },
    "from":1
    "size":1
    "sort":[
        {"字段":{
            "order":"desc"
        }
        }
    ]
}
  • 聚合查询
GET lagou/_search
{
    "类型":{
        "分组名":{
            "term":{    # stat min都可以使用
            "字段":内容
            ...
            }
        }
    }
}
  • term查询(全量查询,必须完全匹配)
GET lagou/job/_search
{
    "query":{
        "term":{
            "字段":内容
            ...
        }
    }
}
  • terms查询(有一个匹配就返回,并且不是全量查询)
GET lagou/job/_search
{
    "query":{
        "terms":{
            "字段":[内容1,...]
            ...
        }
    }
}
  • 多字段查询
GET lagou/job/_search
{
    "query":{
        "multi_match":{
            "query":内容,
            "fields":[字段1^3,字段2...] # ^3表示权重
        }
    }
}
  • 语法查询
GET lagou/job/_search
{
    "query":{
        "query_string":{
            "query":"condition AND|OR condition",
            "fields":[字段1^3,字段2...] # ^3表示权重
        }
    }
}
  • 范围查询(时间字段可以使用now关键字)
GET lagou/job/_search
{
    "query":{
        "range":{
            "字段":{
                "gte":10,
                "lte":20,
                "boost":2.0 # 权重
            }
        }
    }
}

组合查询

  • bool查询
GET lagou/job/_search
{
    "query":{
        "bool":{
            "filter":{ # 过滤字段
                "查询方式":{ # "term"|"match"等
                    "字段":内容
                }
            },
            "must":[],      # 条件必须全部满足
            "should":[],    # 条件满足其一
            "must_not":[]   # 必须一个不满足
        }
    }
}
  • 查看分析器结果
GET _analyze
{
    "analyzer":"ik_max_word", # 与ik_smart区别:ik_smart以最小词量分词,如工程师就不会再进行工程/师分词
    "text":"内容"
}

相关推荐