企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# Term Query(项查询) 原文链接 : [https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html) 译文链接 : [http://www.apache.wiki/pages/viewpage.action?pageId=4260518](http://www.apache.wiki/pages/viewpage.action?pageId=4260518) 贡献者 : @小布丁 **term query** (项查询)是查找包含在反向索引中指定的**确切项**的文档。 例如: ``` POST _search { "query": { "term" : { "user" : "Kimchy" } ① } } ``` ①在反向索引的 _user_ 类型中查询确切项包含 _Kimchy_ 的文档。 可以指定 _boost_ 参数,用以使此**term query** (项查询)比另一个查询具有更高的相关性分数。 例如: ``` GET _search { "query": { "bool": { "should": [ { "term": { "status": { "value": "urgent", "boost": 2.0 ① } } }, { "term": { "status": "normal" ② } } ] } } } ``` ①紧急查询子句有一个 _boost 2.0_,意味着它比正常查询子句重要两倍。 ② _normal_ 子句拥有默认中立的 _boost 2.0 。_ **为什么 term query (项****查询)与我的文档不匹配?** 字符串字段可以是 **text**(文本类型:作为完整文本处理,如电子邮件正文)、 **keyword **(关键字:视为精确值,如电子邮件地址或邮政编码)、 **Exact values**(精确值:如数字,日期和关键字)在字段中指定的精确值添加到倒排索引中确保它可以被搜索。 然而,文本字段是被分析过的。这意味着它们的值首先通过 **[analyzer](https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis.html)**(分析器)以产生项列表,然后将其添加到倒排索引。 有很多方法可以分析文本:默认 **[standard analyzer](https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-standard-analyzer.html)**(标准分析器) 删除大多数标点符号,将文本分成单个单词,并将其减少。例如,标准分析器会将字符串 “Quick Brown Fox!” 改成项 [quick,brown,fox] 。 这个分析过程使得可以在一大块全文中搜索单个单词。 **term query**(项查询)在字段的倒排索引中查找一个**确切的项**,它并不知道关于字段 **analyzer **(分析器)的任何事。这就确保在使用 **keyword **(关键字)、数字、日期等字段查找值是有用的。当查询全文字段的时候,使用 **[match query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html)** (匹配查询)来替代,它可以清楚的知道字段如何被分析的。 为了演示,尝试下面的例子。首先,创建一个索引,指定字段映射,并索引文档: ``` PUT my_index { "mappings": { "my_type": { "properties": { "full_text": { "type": "text" ① }, "exact_value": { "type": "keyword" ② } } } } } PUT my_index/my_type/1 { "full_text": "Quick Foxes!", ③ "exact_value": "Quick Foxes!" ④ } ``` ① _full_text_(全文本) 字段是 **text**(文本) 类型并且将被分析。 ② exact_value (精确值) 字段是 **keyword** (关键字)类型并且不会被分析。 ③ _full_text_(全文本)倒排索引将会包含项列表: _[quick,foxes]_ 。 ④ exact_value (精确值)倒排索引将会包含精确项:_[Quick Foxes!]_ 。 现在,对比一下 **term query** (项查询)和 **match query** (匹配查询)的结果集: ``` GET my_index/my_type/_search { "query": { "term": { "exact_value": "Quick Foxes!" ① } } } GET my_index/my_type/_search { "query": { "term": { "full_text": "Quick Foxes!" ② } } } GET my_index/my_type/_search { "query": { "term": { "full_text": "foxes" ③ } } } GET my_index/my_type/_search { "query": { "match": { "full_text": "Quick Foxes!" ④ } } } ``` ① 该查询匹配到结果,是因为 _exact_value_ (精确值)字段包含精确项 _Quick Foxes!_ 。 ② 该查询没有匹配到结果,是因为 _full_text_ (全文本)字段仅包含项 _quick_ 和 _foxes_ 。并不包含精确项 _Quick Foxes!_ 。 ③ 项 _foxes_ 通过 **term query** (项查询)匹配到 _full_text_ (全文本)字段。 ④ **match query** (匹配查询)首先在 _full_text_ (全文本)字段上分析查询字符串,然后查看文档是否包含 _quick_ 或者 _foxes_ 或者 _quick foxes_ 。