ES:Query DSL搜索语法

1、Query DSL的基本语法

{
    QUERY_NAME: {
        ARGUMENT: VALUE,
        ARGUMENT: VALUE,...
    }
}

{
    QUERY_NAME: {
        FIELD_NAME: {
            ARGUMENT: VALUE,
            ARGUMENT: VALUE,...
        }
    }
}

例:

GET /test_index/test_type/_search 
{
  "query": {
    "match": {
      "test_field": "test"
    }
  }
}

2、如何组合多个搜索条件

bool 查询与 bool 过滤相似,用于合并多个查询子句。不同的是,bool 过滤可以直接给出是否匹配成功, 而bool 查询要计算每一个查询子句的 _score (相关性分值)。

  • must:: 查询指定文档一定要被包含。
  • must_not:: 查询指定文档一定不要被包含。
  • should:: 查询指定文档,有则可以为文档相关性加分。
    在这里插入图片描述

3、filter与query对比

在这里插入图片描述

filter,仅仅只是按照搜索条件过滤出需要的数据而已,不计算任何相关度分数,对相关度没有任何影响

query,会去计算每个document相对于搜索条件的相关度,并按照相关度进行排序

一般来说,如果你是在进行搜索,需要将最匹配搜索条件的数据先返回,那么用query;如果你只是要根据一些条件筛选出一部分数据,不关注其排序,那么用filter
除非是你的这些搜索条件,你希望越符合这些搜索条件的document越排在前面返回,那么这些搜索条件要放在query中;如果你不希望一些搜索条件来影响你的document排序,那么就放在filter中即可

filter,不需要计算相关度分数,不需要按照相关度分数进行排序,同时还有内置的自动cache最常使用filter的数据

query,相反,要计算相关度分数,按照分数进行排序,而且无法cache结果

4、各种query搜索语法

1、match all
可以查询到所有文档,是没有查询条件下的默认语句。

GET /_search
{
    "query": {
        "match_all": {}
    }
}

此查询常用于合并过滤条件。 比如说你需要检索所有的邮箱,所有的文档相关性都是相同的,所以得到的_score为1.
2、match
match查询是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。
如果你使用 match 查询一个全文本字段,它会在真正查询之前用分析器先分析match一下查询字符:

GET /_search
{
  "query": {
    "match": {
      "title": "my elasticsearch article"
    }
  }
}

做精确匹配搜索时,你最好用过滤语句,因为过滤语句可以缓存数据。

扫描二维码关注公众号,回复: 3939037 查看本文章

3、multi match
multi_match查询允许你做match查询的基础上同时搜索多个字段,在多个字段中同时查一个

GET /company/employee/_search
{
  "query": {
    "multi_match": {
      "query": "xian",
      "fields": ["address.*", "name"]
    }
  }
}

4、range query
range过滤允许我们按照指定范围查找一批数据:

  • gt :: 大于
  • gte:: 大于等于
  • lt :: 小于
  • lte:: 小于等于
GET /company/employee/_search 
{
  "query": {
    "range": {
      "age": {
        "gte": 30
      }
    }
  }
}

5、term query
term主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型):

GET /company/employee/_search 
{
  "query": {
    "term": {
      "join_date": "2015-01-01"
    }
  }
}

6、terms query
terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一起去做匹配:

GET /company/employee/_search
{
  "query": {
    "terms": {
      "age": [
        30,
        35
      ]
    }
  }
}

猜你喜欢

转载自blog.csdn.net/jiaojiao521765146514/article/details/83620595
今日推荐