Elasticsearch match、term、filter、query的区别

term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇

match和term的区别是,match查询的时候,elasticsearch会根据你给定的字段提供合适的分析器,而term查询不会有分析器分析的过程

match查询相当于模糊匹配,只包含其中一部分关键词就行

match查询会先对搜索词进行分词,分词完毕后再逐个对分词结果进行匹配,相对于term的精确搜索,match是分词匹配搜索

两者查询的结果构成

  1. query查出来的结果包括数据表里面符合条件的文档信息以及相关度得分(_score)
  2. filter查出来的结果要么是数据表里面符合条件的文档信息,要么为null,并且不会计算相关度得分

查询过程

这里以query检索下的must查询方式和filter过滤检索做对比,两者在查询数据后得出的结果(只看查出来的数据表里面的文档信息)是一致的,但是它们的查询过程不一样.

举个例子:在同一个 index(数据库)下的同一个type(数据表)查询符合条件的name和age.

  1. query是从数据表中先查出符合name条件的数据作为集合A,再从数据表中查出符合age条件的数据作为集合B,两者再取交集得出最后结果.
  2. filter是从数据表中查出符合name条件的数据作为集合,再使用过滤器直接从该集合中过滤出符合age条件的数据,得出最后结果.

使用场景

简单来说,全文检索和需要计算相关度得分来做排序的场景,使用query

其他情况都使用filter过滤查询

性能方面

  1. filter是简单的过滤查询,对集合内的数据只进行满足/不满足条件的筛选,所以处理速度比较快.另外,因为filter过滤的工作原理,每次对文档做相同的过滤操作都会重新启用此信息,所以filter有缓存功能
  2. query不仅有查询操作,还要计算符合条件的文档的相关度得分,底层操作复杂导致处理速度没有filter快.另外,query的查询结果是不可缓存的

Elasticsearch下query和filter的区别
吃透 | Elasticsearch filter和query的不同

<think>嗯,用户想知道如何在Elasticsearch中使用nativeQuery进行搜索。首先,我需要确认“nativeQuery”在Elasticsearch中的具体含义。通常,这个术语可能指的是使用Elasticsearch的原生查询DSL,而不是通过某些客户端库或抽象层来构建查询。 根据引用内容,比如引用[1]提到Elasticsearch的查询构建器中移除了过滤器上下文,现在由Lucene根据是否需要评分来决定查询和过滤器的区别。这可能影响到如何编写bool查询,特别是should子句的minimum_should_match参数。用户可能需要了解如何正确构建这种查询结构。 接下来,引用[2]中提到了别名可以定义过滤器和路由参数。这可能与在查询中使用过滤器有关,比如在bool查询的filter子句中使用term查询,这时候不需要评分,可以更高效。这也属于原生查询DSL的一部分,用户可能需要知道如何结合过滤器和查询来优化搜索性能。 另外,引用[3]提到_update_by_query使用滚动批量处理,这可能与执行批量操作有关,但用户的问题是关于搜索的,所以这部分可能暂时用不上,但需要留意是否有其他相关操作。 用户的需求可能涉及如何直接使用Elasticsearch的查询DSL来构建查询,而无需依赖高级客户端的方法。可能需要解释基本的结构,比如使用query字段,各种查询类型(如matchterm、bool),以及如何组合它们。同时,还需要提到性能优化的方法,如使用filter上下文避免评分,或者使用别名进行路由和过滤。 需要确保回答覆盖以下几点: 1. 原生查询DSL的基本结构。 2. 常用的查询类型和示例。 3. 如何结合过滤器和查询,利用bool查询优化性能。 4. 可能的相关问题,如性能调优、复合查询构建、与客户端查询的区别等。 还要注意用户提到的格式要求,比如行内公式用$...$,独立公式用$$...$$,但这里可能不需要数学公式,但需要正确使用代码块和引用标注。回答需要结构清晰,分步骤说明,并生成相关问题。</think>在Elasticsearch中,`nativeQuery`一般指直接使用Elasticsearch的原生查询DSL(Domain Specific Language)进行搜索操作。以下是具体使用方法及关键步骤: --- ### 1. **原生查询DSL的基本结构** Elasticsearch的查询通过JSON格式定义,核心是`query`参数。例如: ```json GET /index_name/_search { "query": { "查询类型": { "字段": "条件" } } } ``` --- ### 2. **常用查询类型及示例** #### (a) **匹配查询(Match Query)** 用于全文搜索,支持分词: ```json GET /products/_search { "query": { "match": { "description": "无线耳机" } } } ``` #### (b) **精确查询(Term Query)** 用于未分词的字段(如`keyword`类型): ```json GET /orders/_search { "query": { "term": { "status.keyword": "已发货" } } } ``` #### (c) **复合查询(Bool Query)** 组合多个查询条件,支持`must`(必须满足)、`should`(或条件)、`must_not`(排除): ```json GET /logs/_search { "query": { "bool": { "must": [ { "match": { "level": "error" } }, { "range": { "timestamp": { "gte": "2023-01-01" }}} ] } } } ``` > 注意:若`should`子句不需要评分,建议将其放在`filter`中以提升性能[^1]。 --- ### 3. **结合过滤器优化性能** 使用`filter`上下文可跳过相关性评分,显著提升查询速度: ```json GET /articles/_search { "query": { "bool": { "must": { "match": { "title": "Elasticsearch" } }, "filter": [ { "term": { "category.keyword": "技术文档" }}, { "range": { "views": { "gt": 1000 }}} ] } } } ``` --- ### 4. **通过别名实现预过滤** 引用[2]中提到的别名功能,可在索引别名中预定义过滤条件: ```json POST /articles/_aliases/tech_articles { "filter": { "term": { "category.keyword": "技术文档" }} } ``` 此后对别名`tech_articles`的查询会自动应用过滤条件。 --- ### 5. **分页与排序** - **分页**:使用`from`和`size` - **排序**:通过`sort`指定字段 ```json GET /products/_search { "query": { "match_all": {} }, "from": 20, "size": 10, "sort": [ { "price": "asc" } ] } ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伟伟哦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值