术语查询
编辑术语查询编辑
返回包含提供字段中一个或多个 精确 术语的文档。
terms
查询与 term
查询 相同,只是您可以搜索多个值。如果文档包含至少一个术语,则该文档将匹配。要搜索包含多个匹配术语的文档,请使用 terms_set
查询。
示例请求编辑
以下搜索返回 user.id
字段包含 kimchy
或 elkbee
的文档。
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
的默认值。介于0
和1.0
之间的 boost 值会降低相关性分数。大于1.0
的值会提高相关性分数。
备注编辑
术语查找编辑
术语查找获取现有文档的字段值。然后,Elasticsearch 将这些值用作搜索术语。当搜索大量术语时,这可能很有用。
要运行术语查找,该字段的 _source
必须启用。您不能使用跨集群搜索在远程索引上运行术语查找。
默认情况下,Elasticsearch 将 terms
查询限制为最多 65,536 个术语。这包括使用术语查找获取的术语。您可以使用 index.max_terms_count
设置更改此限制。
为了减少网络流量,术语查找将尽可能从本地数据节点上的分片获取文档的值。如果您的术语数据不大,请考虑使用具有单个主分片且在所有适用数据节点上完全复制的索引,以最大程度地减少网络流量。
要执行术语查找,请使用以下参数。
术语查找参数编辑
术语查找示例编辑
要查看术语查找的工作原理,请尝试以下示例。
-
创建一个具有名为
color
的keyword
字段的索引。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" } } } }
-
索引一个 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"] }
-
索引另一个 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" }
-
使用具有术语查找参数的
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" } } ] } }