`
weitao1026
  • 浏览: 1048312 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

elasticsearch的and,filter,or

 
阅读更多

这里有一篇很好的文章,很不错,翻译和整理了一下,英文不错的,建议直接看原文: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 是完全不同,在查询性能上面的影响是非常大的。

 

首先咱们需要了解的是filter里面都是怎么工作的,其中核心的一个东西叫BitSet,可以理解为一个很大的bit数组,数组里面的每个元素有2个状态:0和1(bloom filter知道么?),而filter大家都知道,只处理文档是否匹配与否,不涉及文档评分操作。如果一个文档和filter查询匹配,那么其对应的bit位就设置为1,匹配不上则设置为0。

es在执行filter查询过滤的时候,会打开lucene的每个segment段文件,然后去判断里面的文档符合该filter与否,这个匹配的结果我们就可以用bitset来存储起来,下次同样的filter查询过来,我们就直接使用内存里面的bitset来进行判断就行了,而不需要再打开lucene的segment文件了,避免了io的操作,这样就可以大大提高查询处理的速度,这也是为什么filter这么高效的原因。

因为lucene的segment段文件是不变的,lucene会产生新段,但是旧段是不变的,所以bitset是重复利用的,根据不同的filter条件和不同的段,会产生相应的bitset,另外不同的查询可能会涉及到多个bitset的做交集,计算机对这种bit位处理过程是非常拿手的,速度很快。

另外,如果filter的结果如果是空的,那么里面的bitset位都是0,es以后在处理该filter的时候,会把该bitset整个忽略掉,提高性能。

前面说完了基础内容,咱们再看看bool filter和AND filter这些的区别吧

bool filter会使用到前面提到过的bitset数据结构(bitset派),而AND \OR\ NOTfilter则不能利用到bitset(non-bitset派),为什么呢?

AND、OR、NOT filter是doc by doc的逐个文档的处理,es逐个加载文档里面的字段内容,然后检查字段的内容是否满足查询条件,不满足的文档就排除在结果集之外,依次迭代进行,直到过完一遍所有的文档,这中间的过程用不到前面提到过的bitset,也就不能重复利用缓存资源

如果你有多个filter条件,即一个AND、OR、NOT里面包含多个filter过滤条件(支持数组的方式),那么处理的逻辑就是每个filter会将依次将生成的结果集传到下一个filter,理论上处理的文档数会越来越少,因为只会过滤减少,不会增加,这样依次过滤,所以一般限制条件比较苛刻的可以放前面执行,这样后面的filter需要处理的文档数就会很小,这样可以大大提高整体处理的速度,另外除了数量上的考虑外,还需要考虑filter的效率问题,一些filter执行效率很低,如Geo filter(大量计算)或者script based filter(动态脚本),建议将这些性能开销比较大的查询放最后执行来提高整体的处理速度。

好了,现在应该有这么一个概念了,AND、OR、NOT是文档by文档,依次处理,如果你的结果集很大,即一个很宽松的查询,命中很多,那么你使用AND、OR、NOT filter是不合适的,但是有些filter是必须文档by文档处理的,如下面的这几个filter:

  • Geo* filters
  • Scripts
  • Numeric_range

所以除了上面那几个没有办法的,其它的filter应该一律使用bool filter来提高查询性能。

如果你的查询里面需要同时使用到bitset和non-bitset类型的filter,则可以组合起来使用bool filter和AND\OR\NOT filter,

前面说了,AND 是结果集依次向后传递,所以我们把性能比较好的放前面,non-bitset放AND的filter的后面,如下面一个包含多个filter类型的复杂的filter

 

{
  "and" : [
    {
      "bool" : {
        "must" : [
          { "term" : {} },
          { "range" : {} },
          { "term" : {} }
        ]
      }
    },
    {
      "or" : [
        { "custom_script" : {} },
        { "geo_distance" : {} }
      ]
    }
  ]
}

 

and 在最外层做wrapper,第一个filter是一个bool filter,里面有3个must的子filter,处理完了之后,得到文档结果集,然后再执行一个or的子filter,OR里面两个查询会分别进行,最终的文档结果集就是我们的搜索结果了。

总之,filter使用的时候,一定要优先使用bitset流,然后还要考虑filter顺序和组合的问题

  • Geo, Script or Numeric_range filter: 使用 And/Or/Not Filters
  • 所有其它的: 使用 Bool Filter

掌握了以上这些,就不难写出高性能的查询了。

分享到:
评论

相关推荐

    ElasticSearch 学习案例

    例如,`match` 查询可以处理全词匹配和部分匹配,而 `bool` 查询可以结合多个条件,实现 AND、OR、NOT 的逻辑组合。 结构化搜索是 Elasticsearch 强大的功能之一,它允许我们在文档的各个字段上执行复杂查询。除了...

    elasticsearch笔记1

    在Elasticsearch中,查询是检索数据的核心操作,本笔记主要介绍了多种查询方式,帮助我们更有效地从索引中获取匹配的数据。 1. **全部查询**: 使用`match_all`查询可以返回索引中的所有文档。在示例中,GET请求`...

    深入解析:如何在 Elasticsearch 中执行布尔查询

    ### 深入解析:如何在 Elasticsearch 中执行布尔查询 在大数据时代,高效的数据管理和分析变得至关重要。Elasticsearch 作为一款基于 Lucene 构建的开源、分布式、RESTful 风格的搜索和分析引擎,凭借其卓越的性能...

    elastic search in action

    ### Elasticsearch in Action 知识点概述 #### 一、引言 《Elasticsearch in Action》是一本深入探讨Elasticsearch技术的书籍,由Radu Gheorghe、Matthew Lee Hinman和Roy Russo共同撰写。本书全面介绍了Elastic...

    es-dsl-cheatsheet:Elasticsearch 查询 DSL 备忘单

    - **Bool Filter**: 组合多个过滤条件,支持AND、OR、NOT操作。 - **Range Filter**: 对数值或日期字段进行范围过滤。 - **Exists Filter**: 检查字段是否存在。 ### 3. 高级查询 - **Fuzzy Query**: 允许一定程度...

    在rust - cch123/elastic-rs中将bool表达式转换为elasticsearch DSL

    在 Elasticsearch 的 DSL 中,这些表达式被转换为 `bool` 查询,它可以组合多种查询条件,通过 must、should、must_not 和 filter 子句来表示 AND、OR、NOT 关系。 在 `elastic-rs` 库中,开发者可能需要将 Rust ...

    ElasticSearch可扩展的开源弹性搜索解决方案.docx

    - **bool**、**and**、**or** 和 **not**:可以组合过滤器以实现复杂的逻辑判断。 - **_name**:用于给过滤器命名,方便在查询中引用。 ##### E. 复合查询 - **bool**:可以组合多个查询,使用 should(可选)、...

    uniql-es:从 UniQL AST 生成 ElasticSearch 查询

    这将生成基于 AST 的 ElasticSearch 查询。 例子 var parse = require ( 'uniql' ) ; var esCompile = require ( 'uniql-es' ) ; var ast = parse ( '( height <= 20 or ( favorites.color == "green" and ...

    generate_filter:为 ES 生成一个简单的搜索过滤器

    在 Elasticsearch (ES) 中,搜索过滤器是一种非常重要的功能,它允许我们对索引中的数据进行精确匹配,以便快速地筛选出符合条件的文档。在这个场景中,我们将探讨如何使用 JavaScript 来创建一个简单的搜索过滤器,...

    eac3to V3.17

    * fields and frames are counted and displayed separately now * added DIRAC bitstream parser * added support for "-24.975" and "-changeto24.975" * Blu-Ray subtitle demuxing: PTS value is now written to...

    CE中文版-启点CE过NP中文.exe

    Mainly minor improvements and some small bugfixes, but also a new 'ultimap like' feature called Code Filter for which you don't need any special hardware for. (Just an extensive list of addresses) ...

    防止sql注入demo

    可以结合使用OWASP ESAPI库、SQL注入检测工具(如SQLMap)等,持续监控和增强安全性。 总结,防止SQL注入是开发过程中必不可少的安全环节。通过理解其原理、应用预编译语句、使用Filter以及结合其他安全措施,可以...

    opengoo 1.3 RC1

    - bugfix: Fixed an issue with cookies that didn't allow you to login to two OpenGoo installations on the same server, or an OpenGoo installation and a Joomla installation - bugfix: Fixed some ...

    spring-boot-reference.pdf

    30.6. Elasticsearch 30.6.1. Connecting to Elasticsearch by Using Jest 30.6.2. Connecting to Elasticsearch by Using Spring Data 30.6.3. Spring Data Elasticsearch Repositories 30.7. Cassandra 30.7.1. ...

    Sortable前端框架

    * Supports touch devices and [modern](http://caniuse.com/#search=drag) browsers (including IE9) * Can drag from one list to another or within the same list * CSS animation when moving items * ...

    luncene api

    - Solr和Elasticsearch是基于Lucene构建的更高级的搜索服务,它们提供了更多的特性,如集群、分布式搜索、更丰富的分析器和管理界面。 总之,Lucene API是构建高效、灵活和可扩展的全文搜索引擎的关键工具。虽然...

    Lucene in Action 配套源码

    9. **分布式搜索**:通过Solr或Elasticsearch等扩展,Lucene可以支持分布式搜索,这使得大型数据集的搜索变得可能。 10. **实时更新**:Lucene支持实时索引,意味着新的文档可以在添加后立即被搜索到,无需重新构建...

    lucene-4.2.1-src.tgz

    10. **分布式搜索**:虽然单个Lucene实例可以处理大量数据,但当数据量更大时,可以通过Solr或Elasticsearch等基于Lucene的项目实现分布式搜索。 通过研究`lucene-4.2.1-src.tgz`中的源代码,开发者不仅可以理解...

    lucene高级搜索进阶项目_03

    通过使用Solr或Elasticsearch等基于Lucene的工具,我们可以实现分布式索引和搜索,处理PB级别的数据。此外,我们还要考虑如何进行备份和恢复,以保证数据的安全性。 最后,我们将学习如何利用Lucene的更新和删除...

Global site tag (gtag.js) - Google Analytics