目录
- 一、关键特性
- 二、工作原理
- 三、使用场景
- 四、命令行示例
Elasticsearch 中的 term
查询是一种精确匹配查询,主要用于查找与指定精确值完全匹配的文档。
一、关键特性
-
精确匹配:
term
查询要求搜索的关键词与文档中对应字段的值完全一致,不涉及任何文本分析(如分词、大小写转换、停用词移除等)。这意味着,如果你搜索的是一个完整的词汇、短语或特定值(如整数、日期、布尔值等),Elasticsearch 将直接在索引的倒排表中查找是否存在与该值精确匹配的项。 -
非分词字段:
term
查询通常应用于未经过分词处理的字段类型,如keyword
、integer
、long
、date
、boolean
等。这些字段在索引时不会被分词器拆分成多个词项,而是作为整体存储在索引中。 -
区分大小写:对于区分大小写的字段(如
keyword
类型),term
查询同样区分大小写。例如,搜索Term
和term
将被视为不同的值。 -
效率较高:由于
term
查询直接在倒排索引中查找特定值,而不涉及复杂的文本分析和评分计算,因此其执行效率通常高于需要进行文本分析的查询类型,如match
、multi_match
等。
二、工作原理
在 Elasticsearch 中,每个文档在索引时都会被分解成多个词项,并为每个词项建立一个倒排索引。term
查询的工作流程如下:
-
接收查询请求:用户提交一个
term
查询,指定要查询的字段名、要匹配的精确值以及(可选的)其他查询参数(如 Boost、Case Sensitive 等)。 -
查找倒排索引:Elasticsearch 根据查询参数,在目标字段的倒排索引中查找与指定精确值完全相同的词项。如果找到了匹配项,Elasticsearch 记录下包含该词项的文档 ID。
-
合并结果:如果有多个分片(shard)包含匹配的文档,Elasticsearch 会合并各个分片的结果集,去除重复的文档 ID,并按指定的排序规则(如有)对结果进行排序。
-
返回结果:Elasticsearch 返回包含匹配文档 ID 的响应,通常还包括文档得分(对于
term
查询,得分通常是 1,因为它是基于精确匹配的,不涉及复杂的评分算法)、命中总数、分页信息等。
三、使用场景
-
精确值过滤:当需要查找具有特定值(如某个产品的唯一标识符、用户的精确年龄、特定状态码等)的文档时,使用
term
查询可以快速定位这些文档。 -
标签、分类或枚举值的筛选:对于存储标签、类别或预定义枚举值的字段(如
category
、status
、color
等),term
查询能够准确地筛选出具有特定标签、类别或枚举值的文档。 -
非文本字段查询:对于非文本类型的字段,如整数、日期、布尔值等,
term
查询是唯一适用的查询方式,因为这些字段的值不具备分词的性质。 -
复合查询中的精确条件:在复杂的复合查询(如 bool 查询、filter 查询等)中,可以使用
term
查询作为精确筛选条件与其他查询类型(如全文查询、范围查询等)组合使用,以实现更精细的查询逻辑。
四、命令行示例
下面是一个使用 term
查询的命令行示例:
curl -X GET "http://localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d'
{
"query": {
"term": {
"product_id": "ABC123"
}
}
}'
在这个例子中,我们向 my_index
索引发起一个搜索请求,查询条件是一个 term
查询,它要求在 product_id
字段中查找值为 “ABC123” 的文档。