词项查询

编辑

返回在提供的字段中包含一个或多个精确词项的文档。

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

示例请求

编辑

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

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

terms 的顶层参数

编辑
<字段>

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

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

默认情况下,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",
        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)
    const response = await client.indices.create({
      index: "my-index-000001",
      mappings: {
        properties: {
          color: {
            type: "keyword",
          },
        },
      },
    });
    console.log(response);
    PUT my-index-000001
    {
      "mappings": {
        "properties": {
          "color": { "type": "keyword" }
        }
      }
    }
  2. color 字段中,索引 ID 为 1 且值为 ["blue", "green"] 的文档。

    resp = client.index(
        index="my-index-000001",
        id="1",
        document={
            "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)
    const response = await client.index({
      index: "my-index-000001",
      id: 1,
      document: {
        color: ["blue", "green"],
      },
    });
    console.log(response);
    PUT my-index-000001/_doc/1
    {
      "color":   ["blue", "green"]
    }
  3. 索引 ID 为 2 且在 color 字段中值为 blue 的另一个文档。

    resp = client.index(
        index="my-index-000001",
        id="2",
        document={
            "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)
    const response = await client.index({
      index: "my-index-000001",
      id: 2,
      document: {
        color: "blue",
      },
    });
    console.log(response);
    PUT my-index-000001/_doc/2
    {
      "color":   "blue"
    }
  4. 使用带有词项查找参数的 terms 查询来查找包含与文档 2 相同的一个或多个词项的文档。包含 pretty 参数,以便响应更易于阅读。

    resp = client.search(
        index="my-index-000001",
        pretty=True,
        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)
    const response = await client.search({
      index: "my-index-000001",
      pretty: "true",
      query: {
        terms: {
          color: {
            index: "my-index-000001",
            id: "2",
            path: "color",
          },
        },
      },
    });
    console.log(response);
    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"
            }
          }
        ]
      }
    }