Elasticsearch match、term、filter、query的区别?
1 个回答
希望有人告诉你开心比对错更重要。梅拾璎### 1. term 查询 - **定义**:term 查询表示完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇。 - **特点**:term 查询不会对搜索词进行分词,是精确搜索。 - **使用场景**:适用于需要精确匹配的场景,比如数字、日期、布尔值、关键词等。 ### 2. match 查询 - **定义**:match 查询会根据字段提供合适的分析器,先对搜索词进行分词,然后逐个对分词结果进行匹配。 - **特点**:match 查询相当于模糊匹配,只需要包含其中一部分关键词就行,是分词匹配搜索。 - **使用场景**:适用于全文检索,需要对文本字段进行分词处理的场景。 ### 3. query 和 filter 的区别 #### 3.1 查询结果的构成 - **query**:查出来的结果包括数据表中符合条件的文档信息以及相关度得分 (_score)。 - **filter**:查出来的结果要么是数据表中符合条件的文档信息,要么为 null,并且不会计算相关度得分。 #### 3.2 查询过程 - **query**:先从数据表中查出符合 name 条件的数据作为集合 A,再查出符合 age 条件的数据作为集合 B,然后取两者的交集得出最后结果。 - **filter**:先从数据表中查出符合 name 条件的数据作为集合,然后使用过滤器直接从该集合中过滤出符合 age 条件的数据,得出最后结果。 #### 3.3 使用场景 - **query**:适用于全文检索和需要计算相关度得分来做排序的场景。 - **filter**:适用于其他情况的过滤查询。 #### 3.4 性能方面 - **filter**:是简单的过滤查询,对集合内的数据只进行满足/不满足条件的筛选,处理速度快,并且具有缓存功能。 - **query**:不仅有查询操作,还要计算符合条件的文档的相关度得分,底层操作复杂,处理速度没有 filter 快,并且查询结果是不可缓存的。 ### 总结 - **term**:用于精确匹配,不进行分词。 - **match**:用于模糊匹配,先进行分词再逐个匹配。 - **query**:用于需要计算相关度得分的查询,适合全文检索。 - **filter**:用于简单的过滤查询,不计算相关度得分,适合需要缓存查询结果的场景。编辑于 2024-02-09 15:16 •IP属地 重庆举报评论收藏
公众号进入网站体验更佳

