elasticsearch基本操作

新建和删除Index

新建 Index,可以直接向 Elastic 服务器发出 PUT 请求。下面的例子是新建一个名叫weather的 Index。

curl -X PUT 'localhost:9200/weather'

服务器返回一个 JSON 对象,里面的acknowledged字段表示操作成功。

{
  "acknowledged":true,
  "shards_acknowledged":true
}

然后,我们发出 DELETE 请求,删除这个 Index。

curl -X DELETE 'localhost:9200/weather'

中文分词设置


elasticsearch plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.7/elasticsearch-analysis-ik-6.8.7.zip

数据操作

新增记录

向指定的 /Index/Type 发送 PUT 请求,就可以在 Index 里面新增一条记录。比如,向/accounts/person发送请求,就可以新增一条人员记录。


curl -H "Content-Type: application/json" -X PUT 'localhost:9200/accounts/person/1' -d '
{
  "user": "张三",
  "title": "工程师",
  "desc": "数据库管理"
}'

服务器返回的 JSON 对象,会给出 Index、Type、Id、Version 等信息。

{
  "_index":"accounts",
  "_type":"person",
  "_id":"1",
  "_version":1,
  "result":"created",
  "_shards":{"total":2,"successful":1,"failed":0},
  "created":true
}

查看记录


curl 'localhost:9200/accounts/person/1?pretty=true'

上面代码请求查看/accounts/person/1这条记录,URL 的参数pretty=true表示以易读的格式返回。

返回的数据中,found字段表示查询成功,_source字段返回原始记录。


{
  "_index" : "accounts",
  "_type" : "person",
  "_id" : "1",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "user" : "张三",
    "title" : "工程师",
    "desc" : "数据库管理"
  }
}

删除记录

删除记录就是发出 DELETE 请求。

curl -X DELETE 'localhost:9200/accounts/person/1'

更新记录

更新记录就是使用 PUT 请求,重新发送一次数据。

 curl -H "Content-Type: application/json" -X PUT 'localhost:9200/accounts/person/1' -d '
{
    "user" : "张三",
    "title" : "工程师",
    "desc" : "数据库管理,软件开发"
}'

返回所有记录

使用 GET 方法,直接请求/Index/Type/_search,就会返回所有记录。

curl 'localhost:9200/accounts/person/_search'

{
  "took":2,
  "timed_out":false,
  "_shards":{"total":5,"successful":5,"failed":0},
  "hits":{
    "total":2,
    "max_score":1.0,
    "hits":[
      {
        "_index":"accounts",
        "_type":"person",
        "_id":"AV3qGfrC6jMbsbXb6k1p",
        "_score":1.0,
        "_source": {
          "user": "李四",
          "title": "工程师",
          "desc": "系统管理"
        }
      },
      {
        "_index":"accounts",
        "_type":"person",
        "_id":"1",
        "_score":1.0,
        "_source": {
          "user" : "张三",
          "title" : "工程师",
          "desc" : "数据库管理,软件开发"
        }
      }
    ]
  }
}

全文搜索

match


curl -H "Content-Type: application/json"  'localhost:9200/accounts/person/_search'  -d '
{
  "query" : { "match" : { "desc" : "软件" }}
}'

Elastic 默认一次返回10条结果,可以通过size字段改变这个设置。

$ curl -H "Content-Type: application/json" 'localhost:9200/accounts/person/_search'  -d '
{
  "query" : { "match" : { "desc" : "管理" }},
  "size": 1
}'

上面代码指定,每次只返回一条结果。

还可以通过from字段,指定位移。

$ curl -H "Content-Type: application/json" 'localhost:9200/accounts/person/_search'  -d '
{
  "query" : { "match" : { "desc" : "管理" }},
  "from": 1,
  "size": 1
}'

上面代码指定,从位置1开始(默认是从位置0开始),只返回一条结果。

match_phrase

  • 可以搜索分词相邻的结果,eg 根据新疆苹果可以搜到香甜新疆苹果而搜不到新疆香甜苹果
  • 可以使用slop指定两个匹配的token位置距离的最大值。
  • 可以使用analyzer指定分词器,覆盖mapping中设置的search_analyzer

冬天暖心羽绒服 冬天超级暖心羽绒服 花花公子暖心羽绒服

我们在设置了slop后允许超级和羽绒服这两个分词后的token距离最大值为2,可以搜索到如下数据了。因为冬天超级暖心羽绒服分词结果为冬天,超级,暖,心,羽绒服,超级与羽绒服距离正好为2,所以能匹配到。

{
  "query": {
    "match_phrase": {
      "name": {
        "query": "超级羽绒服",
        "analyzer": "ik_smart",
        "slop": 2
      }
    }
  }
}

逻辑运算

如果有多个搜索关键字, Elastic 认为它们是or关系。

curl 'localhost:9200/accounts/person/_search'  -d '
{
  "query" : { "match" : { "desc" : "软件 系统" }}
}'

上面代码搜索的是软件 or 系统。

如果要执行多个关键词的and搜索,必须使用布尔查询。

bool组合查询#

bool查询可以组合多种叶子查询,包含如下:

  • must:出现于匹配查询当中,有助于匹配度(_score)的计算
  • filter:必须满足才能出现,属于过滤,不会影响分值的计算,但是会过滤掉不符合的数据
  • should:该条件下的内容是应该满足的内容,如果符合会增加分值,不符合降低分值,不会不显示
  • must_not:满足的内容不会出现,与filter功能相反,属于过滤,不会影响分值的计算,但是会过滤掉不符合的数据

{
  "query": {
    "bool": {
      "must": [
        {    
          "match": {
            "name": "花花公子羽绒服"
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "proId": 6
          }
        }
      ], 
      "should": [
        {
          "terms": {
            "name.keyword": ["花花公子暖心羽绒服", "花花公子外套"]
          }
        }
      ], 
      "filter": {
        "range": {
          "createTime": {
            "gte": "2019-12-12 17:56:56",
            "lte": "2019-12-19 17:56:56",
            "format": "yyyy-MM-dd HH:mm:ss"
          }
        }
      }
    }
  }
}
curl 'localhost:9200/accounts/person/_search'  -d '
{
  "query": {
    "bool": {
      "must": [
        { "match": { "desc": "软件" } },
        { "match": { "desc": "系统" } }
      ]
    }
  }
}'

文章作者: 凌云
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 凌云 !
  目录