Elasticsearch的DSL之query and filter

在Elasticsearch的DSL中, 有两个概念需要搞清楚, query 和 filter, 对ES的检索效率是很有影响的。

下面就来搞清楚这两个关键字的具体函数。

query context: 回答的是这个文档在多大程度上匹配查询语句(How well does this document match this query clause?),会计算出一个分数_score。

filter context: 回答的是这个文档与查询语句是否匹配,是 或者 不是(Does this document match this query clause?),不会计算分数。

除了需要匹配程度的查询(有_score的情况)使用query, 其余的查询都应该使用filter。(As a general rule,
use query clauses for full-text search or for any condition that should affect the relevance score, and use filters for everything else.)

filter的结果是会被ES缓存的, 以此来提高效率。

另外, filter由于不计算分数及排序, 所以, 速度较 query要快。

下面的例子来自https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html

GET _search
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "title":   "Search"        }}, 
        { "match": { "content": "Elasticsearch" }}  
      ],
      "filter": [ 
        { "term":  { "status": "published" }}, 
        { "range": { "publish_date": { "gte": "2015-01-01" }}} 
      ]
    }
  }
}


The query parameter
indicates query context.


 


The bool and
two match clauses
are used in query context, which means that they are used to score how well each document matches.



The filter parameter
indicates filter context.


 


The term and range clauses
are used in filter context. They will filter out documents which do not match, but they will not affect the score for matching documents.

时间: 2024-08-27 09:03:04

Elasticsearch的DSL之query and filter的相关文章

elasticsearch query 和 filter 的区别

Query查询器 与 Filter 过滤器 尽管我们之前已经涉及了查询DSL,然而实际上存在两种DSL:查询DSL(query DSL)和过滤DSL(filter DSL).过滤器(filter)通常用于过滤文档的范围,比如某个字段是否属于某个类型,或者是属于哪个时间区间* 创建日期是否在2014-2015年间?* status字段是否为success? * lat_lon字段是否在某个坐标的10公里范围内? 查询器(query)的使用方法像极了filter,但query更倾向于更准确的查找.

elasticsearch的javaAPI之query

elasticsearch的javaAPI之query API the Search API允许执行一个搜索查询,返回一个与查询匹配的结果(hits). 它可以在跨一个或多个index上执行, 或者一个或多个types. 查询可以使用提供的 query Java API 或filter Java API . 搜索请求的主体是建立使用 SearchSourceBuilder上. 这里有一个例子: import org.elasticsearch.action.search.SearchRespon

ES的Query、Filter、metric、bucketing使用详解

由于笔者在实际项目仅仅将ES用作索引数据库,并没有深入研究过ES的搜索功能.而且鉴于笔者的搜索引擎知识有限,本文将仅仅介绍ES简单(非全文)的查询API. 笔者原本打算在本文中介绍聚合API的内容,但是写着写着发现文章有点过长,不便于阅读,故将聚合API的内容移至下一篇博客中. 引言 单单介绍理论和API是乏味和低效率的,本文将结合一个实际的例子来介绍这些API.下表是本文数据表的表结构,表名(type)为“student”.注意,studentNo是本表的id,也就是_id字段的值与stude

Elasticsearch的javaAPI之Query DSL-filters

和REST query dsl一样,elasticsearch提供了一个完整的Java query dsl. 工厂过滤器建造者是FilterBuilders 一旦准备好您的查询,就可以使用query api. 如何构建查询?使用FilterBuilders,导入它们在你的类: import org.elasticsearch.index.query.FilterBuilders.*; 请注意,在FilterBuilder对象上可以轻松地打印(又名调试) 查询生成的JSON,用 toString(

Elasticsearch的javaAPI之query dsl-queries

和rest query dsl一样,elasticsearch提供了一个完整的Java query dsl. 查询建造者(factory)是 QueryBuilders . 一旦准备好您的查询,您可以使用query api. 如何使用QueryBuilders?仅仅就是加入下面的包: import org.elasticsearch.index.query.QueryBuilders.*; 请注意,您可以轻松地打印(又名调试) 查询生成的JSON,用 toString()方法 QueryBuil

elasticsearch中如何高效的使用filter

这里有一篇很好的文章,很不错,翻译和整理了一下,英文不错的,建议直接看原文:http://euphonious-intuition.com/2013/05/all-about-elasticsearch-filter-bitsets/ elasticsearch里面有BOOL filter.AND.OR.NOT filter,这几个看起来很相似,都有什么区别呢?什么时候用boolfilter?什么时候用AND filter呢? 事实上,bool filter和AND .OR.NOT filter

ElasticSearch(十二) Bool Query JAVA API

Bool Query 用于组合多个叶子或复合查询子句的默认查询 must 相当于 与 & = must not 相当于 非 ~   != should 相当于 或  |   or  filter  过滤 boolQuery() .must(termQuery("content", "test1")) .must(termQuery("content", "test4")) .mustNot(termQuery(&quo

ES 23 - 检索和过滤的区别 (query vs. filter)

目录 1 filter与query示例 1.1 准备测试数据 1.2 搜索测试 2 filter与query的区别 2.1 相关度处理上的不同 2.2 性能上的对比 2.3 对比结论 本文以 ES 6.6.5 版本为例进行演示. 1 filter与query示例 1.1 准备测试数据 PUT website/_doc/1 { "title": "小白学ES01", "desc": "the first blog about es&quo

(12)ElasticSearch 基本查询(Query查询)

1.数据准备 PUT /lib3 { "settings":{ "number_of_shards":3, "number_of_replicas":0 }, "mappings":{ "user":{ "properties":{ "name":{"type":"text"}, "address":{&qu