`

elasticsearch filter bitset

阅读更多

关于elasticsearch filter bitset的全部

在使用ES进行查询时,你常常会发现自己深深地陷入了过滤器的各种复合中。假设你需要过滤满足下面要求的用户:

bitset

首先需要看看bitset如何工作的。基本上,bitset是一个表示状态的列表。每个位置非0即1.

过滤器不对文档打分——仅仅是包含或者拒绝。如果文档匹配了一个过滤器,则在bitset中会置成1;否则置为0.于是ES就可以在一个紧致的bitset中存储整个分段的过滤信息。

ES第一次执行过滤器时,他解析了Lucene的分段数据结构来判断哪些东西匹配了你的过滤器。而且会将这个信息存放在一个Bitset中。
下次同样的过滤器执行时,ES可以找到压缩后的Bitset而不是Lucene分段。这将带来性能的巨大提升。

我喜欢bitset的原因

怎么说bitset快都不为过

按bit进行操作是一个基础的计算单元,CPU专门设计为按照按bit操作的。执行一个内存中的按位AND比解析Lucene数据结构和手动地执行交集操作要快好几个数量级。

拥有多个过滤器时,可以进行AND操作来获得最终匹配的文档。

更好的是,bitset独立于查询本身进行cache。复杂的查询可以用一堆过滤器,但是这些过滤器bitset是独立的并且可以在其他的上下文环境中进行使用。这就使得ES重用过滤器非常高效。

而且因为bitset针对每个segment进行存储,ES可以做出一些非常酷的性能技巧。Lucene分段是不可变的——一旦写入磁盘,便永不改变

如果一个特定的过滤器不匹配一个分段中的任何文档(bitset中所有位置都是0),ES可以在其执行过滤操作时忽略整个bitset。

类似的,当新的分段被加进来时,缓存的过滤bitset不需要被关闭。如果你索引新的文档进入一个mysql表,例如B-Tree索引是不断地进行更新的。

使用ES过滤器缓存,只有新创建的分段需要构建过滤器bitset,老的bitset可以不需要修改进行重用。

boolean 还是 and/or/not

“可是这跟我有啥关系呢?”你也许会问。

当然重要了,因为bool过滤器使用了Bitset而and/or/not过滤器没有/如果你将一个term过滤器放入一个and中,尽管它存在,也不会用到Bitset。

为什么?

and/or/not是一个文档一个文档进行的。首先会载入需要放入field数据内存池中,然后对这些文档进行遍历。不会有bitset被使用,也就不会有缓存的过滤器重用复合了。ES简单地扫描文档的列表,并独立地检查每个。

如果你有多个过滤器,and/or/not将进行短路操作,只会传递匹配的文档进入下一个过滤器。

这个会降低每个后续的需要执行的过滤器工作量。因此,你最重的过滤器应该放到最后位置——典型例子是Geo过滤因为他们会进行相当重的计算来确定距离。

什么时候使用and/or/not

看起来Bool过滤器在任何方面都超过了对手,那么有没有什么时候需要使用and/or/not呢?

and/or/not在你使用哪些不返回bitset的过滤器时更有效率。这些操作肯定需要对每个文档进行一遍。例如,定制的script不是可以bitset化,因为它对每个文档进行计算。

在这些情形下,and/or/not是比bool更好的选择。Non-Bitset过滤器非常少,下面列出来:

  • Geo* filter
  • Scripts
  • Numeric_range

其他的过滤器都应该放在一个bool中

把bool和and/or/not结合起来

当你遇到需要用到这两者的情形时,可以将他们合起来使用。总是使用一个and/or/not整合起来。例如,你有这样的数据:

  • Gender: Male
  • Age: 23-26
  • Language: English
  • Custom Script
  • Geo

你过滤器列表看起来就是这样:

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

总结

过滤器让我们可以找到想要的文档,通过使用bitset操作来代替简单的排除操作来提高查询性能。当我们整合过滤器时,确保你花了时间来考虑如何组织他们来使用合适的聚合过滤器的类:

  • Geo, Script or Numeric_range filter: Use And/Or/Not Filters
  • Everything else: Use Bool Filter

from http://www.jianshu.com/p/627a4459975d

分享到:
评论

相关推荐

    (狂神)ElasticSearch快速入门笔记,ElasticSearch基本操作以及爬虫(Java-ES仿京东实战)

    (狂神)ElasticSearch快速入门笔记,ElasticSearch基本操作以及爬虫(Java-ES仿京东实战),包含了小狂神讲的东西,特别适合新手学习,笔记保存下来可以多看看。好记性不如烂笔头哦~,ElasticSearch,简称es,es是一个...

    7.17.1系列Elasticsearch的elasticsearch-analysis-ik分词器

    适用于7.17.1系列,例如Elasticsearch的7.17.12版本。 elasticsearch-analysis-ik 是一个常用的中文分词器,在 Elasticsearch 中广泛应用于中文文本的分析和搜索。下面是 elasticsearch-analysis-ik 分词器的几个...

    elasticsearch elasticsearch-6.2.2 elasticsearch-6.2.2.zip 下载

    根据提供的文件信息,我们可以推断出本篇文章将围绕Elasticsearch 6.2.2版本进行详细介绍,包括其下载方式、主要功能特性以及在实际应用中的常见用途。 ### Elasticsearch简介 Elasticsearch是一款基于Lucene的...

    elasticsearch 8.11.3 windows安装包

    Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。Kibana 使您能够以交互方式探索、可视化和分享对数据的见解,...

    Elasticsearch 开机自启脚本

    `start` 用于启动Elasticsearch,这里使用 `su` 命令切换到指定的Elasticsearch用户(例如 `es-admin`),然后进入Elasticsearch的安装目录并执行 `bin/elasticsearch` 文件以后台模式启动服务。`stop` 通过查找并杀...

    elasticSearch(ES)最新版 ik分词插件7.10 elasticsearch-analysis-ik-7.10.0

    Elasticsearch(ES)是一种流行的开源全文搜索引擎,它基于Lucene构建,提供了分布式、RESTful风格的搜索和分析引擎服务。在中文环境下,为了实现精确的分词和搜索,我们需要安装适合版本的分词插件,如“elastic...

    Elastic Search搭建使用教程.pdf(内含ElasticSearch教程权威指南)

    Elasticsearch是一款基于Lucene的开源搜索引擎,它使用RESTful接口进行数据操作,数据以JSON格式存储。Elasticsearch以其高效的全文搜索功能,实时数据处理能力,以及易于使用的特性,在众多企业中得到了广泛应用,...

    es-head Elasticsearch的可视化操作插件

    es-head是一个针对Elasticsearch的可视化操作插件。它提供了一个便捷的操作工具,可以连接Elasticsearch搜索引擎,并提供可视化的操作页面,对Elasticsearch进行各种设置和数据检索功能的管理。 es-head 插件可以在...

    基于.netcore搜索封装ElasticSearch.zip

    这个名为"基于.netcore搜索封装ElasticSearch.zip"的压缩包,显然包含了一个针对.NET Core平台的Elasticsearch客户端库,方便开发者在.NET Core应用中集成和操作Elasticsearch。 Elasticsearch是一个开源的分布式...

    Elasticsearch 开发手册

    在数据抽取 ELT 领域,ES 全家桶 ELK(Elasticsearch+Logstash+Kibana)赫赫有名。 Elasticsearch 基本概念: * 倒排索引:Elasticsearch 为什么快,核心设计理念就是采用了倒排索引机制。倒排索引的方式是,根据 ...

    elasticsearch-6.8.18.rar(elasticsearch-6.8.18.zip)

    Elasticsearch是一个强大的开源搜索引擎,基于Apache Lucene构建,它为开发者和数据分析师提供了高效、可扩展、实时的搜索和分析功能。6.8.18版本是Elasticsearch的一个稳定版本,它在前几个版本的基础上进行了优化...

    elasticsearch7.14.0.zip

    Elasticsearch 7.14.0 是一个高度可扩展的全文搜索引擎,广泛应用于日志分析、实时数据分析和全文检索等多个领域。这个压缩包包含了针对Windows和Linux操作系统的安装包,便于在不同环境下部署和使用Elasticsearch。...

    elasticsearch-6.8.3-API文档-中文版.zip

    赠送jar包:elasticsearch-6.8.3.jar; 赠送原API文档:elasticsearch-6.8.3-javadoc.jar; 赠送源代码:elasticsearch-6.8.3-sources.jar; 赠送Maven依赖信息文件:elasticsearch-6.8.3.pom; 包含翻译后的API文档...

    elasticsearch服务器安装包

    2. **下载安装包**:这里的"es安装包"即为Elasticsearch的安装文件,通常是一个zip或tar.gz格式的压缩包。你需要从官方网站或者镜像站点下载对应版本的安装包,确保与你的系统兼容。 3. **解压安装**:下载完成后,...

    Elasticsearch-head谷歌插件谷歌插件.zip

    "es-head"是Elasticsearch-head的简写,它允许用户无需编写复杂的curl命令就能与Elasticsearch进行交互。通过这个插件,你可以查看索引的状态,监控节点健康状况,查看集群统计信息,甚至进行索引的创建、删除和映射...

    elasticsearch常用版本

    标题提及的"elasticsearch常用版本"意味着我们将关注几个Elasticsearch的主流版本,包括elasticsearch-2.4.4、elasticsearch-6.2.3。每个版本都有其特定的特性和改进,适应不同的需求和环境。 1. **Elasticsearch ...

    elasticsearch-7.17.6及对应版本IK分词

    elasticsearch-7.17.6及对应版本IK分词 适合人群:elasticsearch初学者 Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elastic...

    ElasticSearch官方测试数据

    Elasticsearch(ES)是一种流行的开源全文搜索引擎,它基于Lucene库构建,被广泛用于大数据分析、日志聚合、实时搜索和索引等场景。官方提供的测试数据集是检验Elasticsearch功能、性能和稳定性的关键资源,可以帮助...

    elasticsearch-8.2.3 windows 版本

    elasticsearch-8.2.3 windows 版本。 Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的...

Global site tag (gtag.js) - Google Analytics