ElasticSearch的复杂查询

120 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

近期在工作中需要使用es进行简单的全文检索,所以最近都在边学边做笔记,也会把自己遇到的bug以及如何解决的,一并记录在这里,供大家学习参考。

ElasticSearch的复杂查询

1.查询匹配

  • match:匹配(会使用分词器解析(先分析文档,然后进行查询))
  • _source:过滤字段
  • sort:排序
  • fromsize分页
GET /test_user/_search
{
    "query":{
        "match":{
            "name":"lisi"
        }
    },
    "_source": ["name","age"],
    "sort": [
    {
        "age": {
            "order": "asc"
        }
    }
    ],
    "from": 0,
    "size": 1
}

2.多条件匹配

  • must等价于and
  • should等价于or
  • must_not等价于not(... and ...)
  • filter过滤
GET /blog/user/_search
{
    "query":{
        "bool": {
            "must": [
            {
                "match":{
                    "age":3
                }
            },
            {
                "match": {
                    "name": "流"
                }
            }
            ],
            "filter": {
                "range": {
                    "age": {
                        "gte": 1,
                        "lte": 3
                    }
                }
            }
        }
    }
}

3.匹配数组

  • 可以多关键字(空格隔开)
GET /test_user/_search
{
    "query":{
        "match":{
            "name":"lisis zhangsan"
        }
    }
}

image.png 4.精确查找

  • term直接通过倒排索引指定词条查询
  • 适合查询number、date、keyword,不适合text
  • 精确查找(必须全部都有,而且不可分,即按一个完整的词查询)
GET /test_user/_search
{
    "query":{
        "term":{
            "name":"zhangsan"
        }
    }
}

image.png 5.text和keyword

  • text:
    • 支持分词全文检索、支持模糊、精确查询,不支持聚合,排序操作;
    • text类型的最大支持的字符长度无限制,适合大字段存储;
  • keyword:
    • 不进行分词直接索引、支持模糊、支持精确匹配,支持聚合、排序操作。
    • keyword类型的最大支持的长度为——32766个UTF-8类型的字符,可以通过设置ignore_above指定自持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。 6.高亮查询
GET /test_user/_search
{
  "query": {
    "match": {
      "name":"zhangsan"
    }
  }
  ,
  "highlight": {
    "fields": {
      "name": {}
    }
  }
}

image.png

GET /test_user/_search
{
  "query": {
    "match": {
      "name":"zhangsan"
    }
  }
  ,
  "highlight": {
    "pre_tags": "<p class='key' style='color:red'>",
    "post_tags": "</p>", 
    "fields": {
      "name": {}
    }
  }
}

image.png