原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/query-dsl-terms-query.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/query-dsl-terms-query.html

terms 查询

返回指定的字段中包含一个或多个确切的词的文档。

除了可以搜索多个值,terms 查询和 term 查询一样。

请求示例

下面这个搜索返回 user 字段包含kimchyelasticsearch的文档。

GET /_search
{
    "query" : {
        "terms" : {
            "user" : ["kimchy", "elasticsearch"],
            "boost" : 1.0
        }
    }
}

terms的顶级参数

<field>

(可选, object) 你想搜索的字段。

该参数的值是你想在指定的字段中查找的一组词。 要返回文档,一个或多个词必须与字段值精确匹配,包括空格和大写。

默认情况下,Elasticsearch 将 terms 查询限制为最多 65,536 个词。 可以使用index.max_terms_count设置来更改此限制。

要将现有文档的字段的值用作搜索词,请使用词项查找(terms lookup)参数。

boost

(可选, float) 用于降低或增加查询的相关性评分的浮点数。默认为 1.0

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

boost 值是相对于默认值 1.0 的。 其值在 01.0 之间时会降低相关性评分,而大于 1.0 时会增加相关性评分。

注意

高亮 terms 查询

高亮 只是尽力而为。 Elasticsearch 可能不会返回terms查询的高亮结果,具体取决于:

  • 高亮器(highlighter)的类型
  • 查询中词的数量

词项查找(terms lookup)

词项查找获取现有文档的字段值。 然后,Elasticsearch 使用这些值作为搜索词。 这在搜索大量词项时会很有帮助。

因为词项查找从文档中获取值,所以必须启用 _source 映射字段才能使用词项查找。 _source 字段默认是启用的。

默认情况下,Elasticsearch 将 terms 查询限制为最多 65,536 个词。 这包括了使用词项查找获取的词项。 可以使用index.max_terms_count设置来更改此限制。

若要执行词项查找,请使用以下参数。

词项查找(terms lookup)的参数
index
(必需, string) 要从中提取字段值的索引的名称。
id
(必需, string) 要获取字段值的文档的ID
path

(必需, string) 要从中提取字段值的字段的名称。 Elasticsearch 使用这些字段的值作为查询的搜索词。

如果字段值包含嵌套内部对象的数组,则可以使用点标记语法来访问这些对象。

routing
(可选, string) 要从中提取词项值的文档的自定义的 路由值。 如果在为文档编制索引时提供了自定义的路由值,则此参数是必需的。
词项查找(terms lookup)示例

要了解词项查找的工作原理,请尝试以下示例。

  1. 创建一个索引,其有一个名为color、类型为keyword的字段。

    PUT my_index
    {
        "mappings" : {
            "properties" : {
                "color" : { "type" : "keyword" }
            }
        }
    }
  2. 添加并索引一个文档,其 id 为 1,字段color的值为["blue", "green"]

    PUT my_index/_doc/1
    {
      "color":   ["blue", "green"]
    }
  3. 添加并索引另一个文档,其 id 为 2,字段color的值为blue

    PUT my_index/_doc/2
    {
      "color":   "blue"
    }
  4. 使用带词项查找参数的 terms 查询去查找包含与文档 2 中的一个或多个词项相同的文档。 包括pretty参数,这样响应更具可读性。

    GET my_index/_search?pretty
    {
      "query": {
        "terms": {
            "color" : {
                "index" : "my_index",
                "id" : "2",
                "path" : "color"
            }
        }
      }
    }

    因为文档 2 和文档 1 在color字段中都包含blue,所以 Elasticsearch 返回了这两个文档。

    {
      "took" : 17,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 2,
          "relation" : "eq"
        },
        "max_score" : 1.0,
        "hits" : [
          {
            "_index" : "my_index",
            "_type" : "_doc",
            "_id" : "1",
            "_score" : 1.0,
            "_source" : {
              "color" : [
                "blue",
                "green"
              ]
            }
          },
          {
            "_index" : "my_index",
            "_type" : "_doc",
            "_id" : "2",
            "_score" : 1.0,
            "_source" : {
              "color" : "blue"
            }
          }
        ]
      }
    }