术语查询编辑

返回包含提供字段中一个或多个 精确 术语的文档。

terms 查询与 term 查询 相同,只是您可以搜索多个值。如果文档包含至少一个术语,则该文档将匹配。要搜索包含多个匹配术语的文档,请使用 terms_set 查询

示例请求编辑

以下搜索返回 user.id 字段包含 kimchyelkbee 的文档。

resp = client.search(
    body={
        "query": {"terms": {"user.id": ["kimchy", "elkbee"], "boost": 1}}
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      terms: {
        'user.id' => [
          'kimchy',
          'elkbee'
        ],
        boost: 1
      }
    }
  }
)
puts response
GET /_search
{
  "query": {
    "terms": {
      "user.id": [ "kimchy", "elkbee" ],
      "boost": 1.0
    }
  }
}

terms 的顶级参数编辑

<field>

(可选,对象) 您要搜索的字段。

此参数的值是您希望在提供的字段中找到的术语数组。要返回文档,一个或多个术语必须与字段值完全匹配,包括空格和大小写。

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

要使用现有文档的字段值作为搜索术语,请使用 术语查找 参数。

boost

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

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

Boost 值相对于 1.0 的默认值。介于 01.0 之间的 boost 值会降低相关性分数。大于 1.0 的值会提高相关性分数。

备注编辑

突出显示 terms 查询编辑

突出显示 只是尽力而为。Elasticsearch 可能会根据以下情况不返回 terms 查询的突出显示结果

  • 突出显示器类型
  • 查询中的术语数量

术语查找编辑

术语查找获取现有文档的字段值。然后,Elasticsearch 将这些值用作搜索术语。当搜索大量术语时,这可能很有用。

要运行术语查找,该字段的 _source 必须启用。您不能使用跨集群搜索在远程索引上运行术语查找。

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

为了减少网络流量,术语查找将尽可能从本地数据节点上的分片获取文档的值。如果您的术语数据不大,请考虑使用具有单个主分片且在所有适用数据节点上完全复制的索引,以最大程度地减少网络流量。

要执行术语查找,请使用以下参数。

术语查找参数编辑
index
(必需,字符串) 要从中获取字段值的索引的名称。
id
(必需,字符串) 要从中获取字段值的文档的 ID
path

(必需,字符串) 要从中获取字段值的字段的名称。Elasticsearch 将这些值用作查询的搜索术语。

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

routing
(可选,字符串) 要从中获取术语值的文档的自定义 路由值。如果在索引文档时提供了自定义路由值,则此参数是必需的。
术语查找示例编辑

要查看术语查找的工作原理,请尝试以下示例。

  1. 创建一个具有名为 colorkeyword 字段的索引。

    resp = client.indices.create(
        index="my-index-000001",
        body={"mappings": {"properties": {"color": {"type": "keyword"}}}},
    )
    print(resp)
    response = client.indices.create(
      index: 'my-index-000001',
      body: {
        mappings: {
          properties: {
            color: {
              type: 'keyword'
            }
          }
        }
      }
    )
    puts response
    res, err := es.Indices.Create(
    	"my-index-000001",
    	es.Indices.Create.WithBody(strings.NewReader(`{
    	  "mappings": {
    	    "properties": {
    	      "color": {
    	        "type": "keyword"
    	      }
    	    }
    	  }
    	}`)),
    )
    fmt.Println(res, err)
    PUT my-index-000001
    {
      "mappings": {
        "properties": {
          "color": { "type": "keyword" }
        }
      }
    }
  2. 索引一个 ID 为 1 且 color 字段值为 ["blue", "green"] 的文档。

    resp = client.index(
        index="my-index-000001",
        id="1",
        body={"color": ["blue", "green"]},
    )
    print(resp)
    response = client.index(
      index: 'my-index-000001',
      id: 1,
      body: {
        color: [
          'blue',
          'green'
        ]
      }
    )
    puts response
    res, err := es.Index(
    	"my-index-000001",
    	strings.NewReader(`{
    	  "color": [
    	    "blue",
    	    "green"
    	  ]
    	}`),
    	es.Index.WithDocumentID("1"),
    	es.Index.WithPretty(),
    )
    fmt.Println(res, err)
    PUT my-index-000001/_doc/1
    {
      "color":   ["blue", "green"]
    }
  3. 索引另一个 ID 为 2 且 color 字段值为 blue 的文档。

    resp = client.index(
        index="my-index-000001",
        id="2",
        body={"color": "blue"},
    )
    print(resp)
    response = client.index(
      index: 'my-index-000001',
      id: 2,
      body: {
        color: 'blue'
      }
    )
    puts response
    res, err := es.Index(
    	"my-index-000001",
    	strings.NewReader(`{
    	  "color": "blue"
    	}`),
    	es.Index.WithDocumentID("2"),
    	es.Index.WithPretty(),
    )
    fmt.Println(res, err)
    PUT my-index-000001/_doc/2
    {
      "color":   "blue"
    }
  4. 使用具有术语查找参数的 terms 查询查找包含与文档 2 相同术语的一个或多个术语的文档。包含 pretty 参数,以便响应更易读。

    resp = client.search(
        index="my-index-000001",
        pretty=True,
        body={
            "query": {
                "terms": {
                    "color": {
                        "index": "my-index-000001",
                        "id": "2",
                        "path": "color",
                    }
                }
            }
        },
    )
    print(resp)
    response = client.search(
      index: 'my-index-000001',
      pretty: true,
      body: {
        query: {
          terms: {
            color: {
              index: 'my-index-000001',
              id: '2',
              path: 'color'
            }
          }
        }
      }
    )
    puts response
    res, err := es.Search(
    	es.Search.WithIndex("my-index-000001"),
    	es.Search.WithBody(strings.NewReader(`{
    	  "query": {
    	    "terms": {
    	      "color": {
    	        "index": "my-index-000001",
    	        "id": "2",
    	        "path": "color"
    	      }
    	    }
    	  }
    	}`)),
    	es.Search.WithPretty(),
    )
    fmt.Println(res, err)
    GET my-index-000001/_search?pretty
    {
      "query": {
        "terms": {
            "color" : {
                "index" : "my-index-000001",
                "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-000001",
            "_id" : "1",
            "_score" : 1.0,
            "_source" : {
              "color" : [
                "blue",
                "green"
              ]
            }
          },
          {
            "_index" : "my-index-000001",
            "_id" : "2",
            "_score" : 1.0,
            "_source" : {
              "color" : "blue"
            }
          }
        ]
      }
    }