es查询 DSL--term level query

1. 概述

2.词级查询的类型

2.1. exists 查询

2.2. fuzzy 查询

2.3. ids 查询

基于文档的ids返回文档,这种查询会使用存储在_id字段的文档id值
Example Request

GET /_search
{
  "query": {
    "ids" : {
      "values" : ["1", "4", "100"]
    }
  }
}

2.3.1 ids的顶级参数

  • values
    (必须,字符串数组):文档id值的数组

2.4. prefix 查询

2.5. range 查询

2.6. regexp 查询

2.7. term 查询

返回所提供的字段中包含确切词的文档。

你可以使用term query根据精确的值来查找文档,比如价格、产品ID或用户名等等。

警告 避免对text类型的字段使用term query
默认情况下,ElasticSearch 会在分析该字段值的过程中改变它的值(即分词,将一个句子拆分成一个个的token)
为了能搜索text字段的值,请使用match query替代

Example request

GET /_search
{
  "query": {
    "term": {
      "user": {
        "value": "Kimchy",
        "boost": 1.0
      }
    }
  }
}

2.7.1 term的顶级参数

  • < field >
    (必须,对象):你希望搜索的字段

2.7.2 < field >的参数

  • value
    (必须,字符串):你希望在指定< field >找到的词。返回的文档,该value必须完全匹配文档字段的值,包括空格大小写

  • boost
    (可选,浮点数):用于增加或减少查询的相关性得分的浮点数,默认为1.0

    您可以使用boost参数来调整包含两个或多个查询的搜索的相关性得分。

    Boost的值是相对于默认值1.0。boost的值在0到1.0之间会会降低相关性得分。大于1.0会增加相关性得分。

2.7.3 注意点

避免对text类型的字段使用term query

默认情况下,ElasticSearch会在分析期间改变字段的值(将句子拆分成一个个的词),比如,默认的standard analyzer标准分词器根据以下的规则改变字段的值:

  • 删除大部分的标点符号
  • 将剩下的内容拆分成单独的词,即所谓的token
  • token转换成小写(将复数单词转换成单数)

为了更好地搜索text类型的字段,match query也会在执行搜索之前分析你所提供的搜索词。这意味着match query可以在文本字段中搜索已分析过的词,而不是精确匹配。

term query不会分析搜索词,它只会精确匹配你提供的搜索词,意味着在搜索text类型的字段时,term query可能返回较少的文档,或者没有文档返回。

为了查看搜索结果中的不同,请尝试以下的示例

  1. 创建一个索引,拥有一个名为full_text,类型为text的字段
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "full_text": { "type": "text" }
    }
  }
}
  1. 索引一条 full_text字段值为 *Quick Brown Foxes!*的文档
PUT my-index-000001/_doc/1
{
  "full_text":   "Quick Brown Foxes!"
}

因为full_text字段是text类型的,所以ElasticSearch在分析的过程中将*Quick Brown Foxes!*改变成了
[quick, brown, fox]

  1. 利用term queryfull_text字段上搜索Quick Brown Foxes!,携带pretty参数将使的响应结果更加具有可读性
GET my-index-000001/_search?pretty
{
  "query": {
    "term": {
      "full_text": "Quick Brown Foxes!"
    }
  }
}

因为full_text字段不再包含*Quick Brown Foxes!*这个精确的词(被es分词了),所以这个查询没有结果返回

  1. 利用match queryfull_text字段上搜索Quick Brown Foxes!
GET my-index-000001/_search?pretty
{
  "query": {
    "match": {
      "full_text": "Quick Brown Foxes!"
    }
  }
}

term query不同,match query在执行搜索之前会分析您提供的搜索词: Quick Brown Foxes!,然后,该查询返回full_text字段中包含quick、brown或fox等token的所有文档。

下面是对结果中包含索引文档的匹配查询搜索的响应。

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.8630463,
    "hits" : [
      {
        "_index" : "my-index-000001",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.8630463,
        "_source" : {
          "full_text" : "Quick Brown Foxes!"
        }
      }
    ]
  }
}

2.8. terms 查询

2.9 terms-set 查询

2.10. type 查询

警告 在7.0.0中弃用
类型和类型查询已被弃用,并正在被逐步删除。详细信息请参阅删除映射类型

过滤匹配指定文档映射类型的文档

GET /_search
{
  "query": {
    "type": {
      "value": "_doc"
    }
  }
}

2.11. wildcard 查询

返回拥有指定字段并且其值 匹配指定的通配符模式 的文档

通配符操作符是匹配一个或多个字符的占位符。例如,*通配符可以匹配零个或多个字符。你可以将通配符操作符与其他字符结合使用起来创建通配符模式。

Example Request
以下的搜索返回user字段的值以ki开头和y结尾的文档,能被匹配到的词包括kiy, kity, 或者 kimchy

GET /_search
{
  "query": {
    "wildcard": {
      "user": {
        "value": "ki*y",
        "boost": 1.0,
        "rewrite": "constant_score"
      }
    }
  }
}

2.11.1 wildcard的顶级参数

  • < field >
    (必须, 对象类型): 你希望搜索的字段

2.11.2 < field >的参数

  • value
    (必须,字符串):你希望匹配提供的< field >的值的通配符模式
    这个参数支持两种通配符操作符:
    • ,匹配任何单个字符
    • * ,匹配0个或多个字符,包括空字符

警告 避免以*?开头的模式。这可能增加查找匹配文档所需的迭代次数,并降低搜索性能。

  • boost
    (可选,浮点数):用于增加或减少查询的相关性得分的浮点数,默认为1.0

    您可以使用boost参数来调整包含两个或多个查询的搜索的相关性得分。

    Boost的值是相对于默认值1.0。boost的值在0到1.0之间会会降低相关性得分。大于1.0会增加相关性得分。

  • rewrite
    (可选,字符串):用于重写查询的方法,有关有效值和更多信息,请参见rewrite参数。

2.11.3 注意点

允许昂贵的查询

如果search.allow_expensive_queries setting参数被设置为false,通配符查询将不会执行。

猜你喜欢

转载自blog.csdn.net/weixin_42237702/article/details/107687902
今日推荐