ElasticSearch之term和match

term和match是在ElasticSearch使用过程中,查询使用场景最多的查询方式,但两者之间存在一定的差异。

term和match的区别

  1. term:代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词解析,直接对搜索词进行查找;
  2. match:代表模糊匹配,搜索前会对搜索词进行分词解析,然后按搜索词匹配查找;

term精确匹配

不使用分析器:term 查询不会应用字段的分析器,它直接在倒排索引中查找准确的术语。

term 查询是直接通过倒排索引指定的词条进行查找的,所以,很显然,term查询效率肯定比match要高。

term 属于精确匹配,只能查单个词。

如果我们想通过 term 匹配多个词的话,可以使用 terms 来实现:
因为 terms 里的[ ] 多个搜索词之间是or(或者)关系,只要满足其中一个词即可。

如果我们想要同时满足两个词精确匹配的话,就得使用 bool 的 must 来做

创建索引库 member 时并没有指定字段的类型,都是es默认生成的类型。默认生成的 name 字段是 text 类型。

两种数据类型:text和keyword

  1. text:查询时会进行分词解析;
  2. keyword:keyword 类型的词不会被分词器进行解析,直接作为整体进行查询;

match模糊匹配

match模糊匹配【实际底层就是多个term查询的结果给汇合在一起】
分析器(Analyzer)应用:match 查询会应用字段指定的分析器(如果有的话)来处理查询字符串。
这意味着它会处理文本数据的大小写、同义词、停用词等。

match 进行搜索的时候,会先进行分词拆分,拆完后,再来匹配。

"张三"被拆分解析为"张"和"三"两个词,所以只要name字段中包含"张"或者"三"的数据都能够匹配上。

如果想 "张"和"三"同时匹配到的话,那么可以使用 match_phrase,来看下面的例子:

match_phrase 称为短语搜索,要求所有的分词必须同时出现在文档中,同时位置必须紧邻一致。
<think> 首先,用户的问题是:“我想了解Elasticsearchmatchterm的区别 请问Elasticsearchmatchterm的区别”。这直接要求解释Elasticsearch中的matchterm查询的区别。 根据系统级指令,我需要使用中文回答,结构清晰,逐步解决问题,并保证回答真实可靠。指令还要求行内数学表达式用$...$,但这里不涉及数学,所以不需要。独立公式用$$...$$,但同样不适用。LaTeX语法正确,但查询不是数学公式。生成相关问题,并在回答末尾添加引用标识。 用户提供了几个引用源: - 引用[1]:解释了term是完全匹配、精确查询,而match是模糊匹配、分词查询。 - 引用[2]:term用于精确匹配,不分词;match会分词。给出了例子。 - 引用[3]:term精确查询,match模糊查询,并强调分词处理。 - 引用[4]:match会分词,term不会;match可能匹配多个词,而term匹配整个词。 这些引用都一致地描述了区别:term是精确匹配(不分词),而match是模糊匹配(分词)。 我的回答应该基于这些引用,确保真实可靠。结构上,我需要清晰、逐步地解释区别。 大纲回答结构: 1. **引言**:简要介绍matchterm查询在Elasticsearch中的作用。 2. **区别总结**: - **term查询**:精确匹配,不进行分词。适用于关键词、数值等。 - **match查询**:模糊匹配,先分词再匹配。适用于文本搜索。 3. **详细解释**: - 使用示例或场景来说明。 - 引用中的关键点:term不分词,直接匹配;match分词后匹配。 4. **例子**:提供简单的查询示例来演示区别。 5. **注意事项**:如match如何使用分词器,term在keyword字段上的使用等。 6. **相关问题**:根据指令,生成相关问题,放在最后。 引用标识:在回答末尾自然地添加引用标识,例如[^1],引用提供的来源。 生成相关问题: - 基于主题:如match_phrase的作用、如何选择查询类型、性能比较等。 具体相关问题: 1. 什么是match_phrase查询?它match查询有什么区别? 2. 在哪些场景下应该使用term查询而不是match查询? 3. Elasticsearch中分词器对match查询的影响是什么? 确保回答真实可靠:基于提供的引用,避免编造信息。 最终回答格式: - 用中文。 - 结构清晰:段落分明。 - 结尾添加引用标识,如[^1]。 - 最后列出相关问题。 </think>### Elasticsearchmatchterm查询的区别 在Elasticsearch中,`match``term`查询是两种常用的搜索方式,但它们在工作原理应用场景上有显著差异。下面我将逐步解释它们的区别,确保回答基于可靠参考源。 #### 1. **核心区别总结** - **`term`查询**: 这是一种**精确匹配**方式。查询时,Elasticsearch不会对搜索词进行分词处理,而是直接与文档中的字段值进行完全匹配。类似于在字典中查找一个完整单词。它适用于数值、日期、布尔值或不需要分词的字符串(如ID、邮政编码)。例如: ```json GET /index/_search { "query": { "term": { "title.keyword": "jstat命令查看jvm的GC信息1" // 精确匹配整个字符串 } } } ``` 如果文档的字段值不是完全相同的词,查询将不返回结果[^2][^3]。 - **`match`查询**: 这是一种**模糊匹配**方式。查询前,Elasticsearch会先对搜索词进行分词处理(例如拆分成单个单词),然后匹配文档中分词后的词条。类似于在文章中搜索关键词。它适用于文本内容搜索,能处理部分匹配情况。例如: ```json GET /index/_search { "query": { "match": { "title": "love China" // 分词为 "love" "China",匹配任意一个 } } } ``` 这会匹配包含"love"或"China"的文档,因为分词后是"或"关系[^1][^4]。 #### 2. **详细工作机制对比** - **分词处理**: - `term`查询:**不分词**。搜索词被视为一个整体,直接与字段值比较。如果字段是文本类型(text),通常需要指定`.keyword`子字段来避免分词影响。 - `match`查询:**先分词**。搜索词通过分词器(如standard analyzer)拆分成词条(tokens),然后与文档中的分词匹配。匹配基于词条的出现频率位置计算相关性得分。 - **匹配逻辑**: - `term`查询:要求**完全一致**。例如搜索`"John Doe"`时,只匹配字段值完全为"John Doe"的文档,不会匹配包含"John"或"Doe"的文档[^2]。 - `match`查询:允许**部分匹配**。分词后,默认使用"或"逻辑(OR),匹配任意词条即可。可以通过参数调整为"与"逻辑(AND),要求所有词条都出现。例如搜索`"love China"`,如果文档包含"love""China"两个词,则匹配;但如果文档只有"love"或只有"China",也可能匹配[^4]。 - **适用场景**: - **使用`term`的场景**:精确值搜索,如用户ID、状态码、枚举类型。例如过滤订单状态为"paid"的文档。 - **使用`match`的场景**:全文搜索,如文章内容、产品描述。例如在日志中搜索"error message"关键词。 - **性能考虑**: - `term`查询通常更快,因为它无需分词,直接利用倒排索引的精确查找。 - `match`查询涉及分词相关性计算,开销较大,但更灵活,适合模糊搜索[^1][^3]。 #### 3. **实际例子说明** 假设索引中有文档: ```json { "title": "I love China" }, { "title": "Hubei province" }, { "title": "China news" } ``` - `term`查询`"China"`:无结果,因为字段值不是完全匹配"China"(如"China news"包含额外词)。 - `match`查询`"China"`:匹配所有包含"China"的文档(如"China news""I love China"),因为分词后"China"单独匹配[^3][^4]。 若需同时匹配多个词(如"love""China"),可用`match_phrase`查询代替`match`,它要求词条按顺序出现[^4]。 #### 注意事项 - **字段类型影响**:`term`查询在keyword字段上效果最佳;`match`查询适用于text字段。确保映射(mapping)正确设置。 - **相关性排序**:`match`查询默认按相关性得分排序(得分高者优先),而`term`查询无此机制。 - **组合使用**:实践中,常将`term`用于过滤,`match`用于搜索,通过`bool`查询结合两者[^1][^2]。 总之,`term`强调精确性,`match`强调灵活性。选择哪种取决于搜索需求:精确匹配用`term`,模糊搜索用`match`[^1][^2][^3][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值