这里有一篇很好的文章,很不错,翻译和整理了一下,英文不错的,建议直接看原文: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
掌握了以上这些,就不难写出高性能的查询了。
相关的3个链接:
http://blog.csdn.net/hljlzc2007/article/details/18549145
相关推荐
为了确保其高效稳定运行,对Elasticsearch进行优化和升级是必不可少的。以下是一些关键的优化策略,主要关注内存管理、系统配置、索引设置以及网络配置。 1. 内存优化:Elasticsearch 建议使用系统内存的50%作为堆...
2. **性能优化**:插件在处理同义词时,通过高效的算法和数据结构,减少了同义词匹配的开销,提升了查询性能。 3. **易用性**:提供简单易懂的配置方式和API,使得开发者能够快速集成和管理同义词功能。 **二、...
- **配置**:在 Elasticsearch 的 `config/elasticsearch.yml` 配置文件中添加 `analysis` 部分,指定使用 IK 分词器。 4. **使用方法** - **创建索引时指定分析器**:在创建索引的映射(mapping)中,可以设置...
4. **Sharding & Replication**:Elasticsearch通过分片(Sharding)实现水平扩展,每个分片可以分布在不同的节点上,提高读写性能。同时,通过副本分片(Replica Shards)实现数据冗余和容错。 二、全文搜索引擎 ...
**Elasticsearch 8.x 向量搜索使用详解** Elasticsearch 8.x 版本引入了对向量搜索的支持,这使得它能够处理非结构化的数据,如图像、文本和语音的语义搜索。向量搜索是通过将数据转换为高维向量并进行相似度比较来...
7.16.2是Elasticsearch的一个稳定版本,对性能和功能进行了优化。 在Linux上安装Elasticsearch-7.16.2-linux-x86_64.tar.gz的过程如下: 1. **下载**:首先,你需要从Elasticsearch官方网站或者通过命令行工具wget...
在当前大数据时代,高效的数据检索系统是不可或缺的,Elasticsearch作为一款流行的开源搜索引擎,因其强大的全文检索、分布式处理和实时分析能力,被广泛应用在各种数据查询场景中。本文作者杨樾人通过软件工程项目...
总结来说,"elasticsearch-http-client.zip"这个压缩包提供的代码示例,详细展示了如何使用Elasticsearch的HTTP客户端在商城场景中实现高效、精准的搜索引擎。通过对Elasticsearch核心特性的理解和实践,我们可以...
- **性能优化**:合理设置索引分片和副本数量,使用合适的数据类型,优化分析器,以及使用倒排索引等技术提高搜索速度。 - **监控与日志**:利用Elasticsearch的内置监控功能监控集群状态,及时发现和解决问题。 ...
安装Elasticsearch Analysis IK插件,首先需要下载`elasticsearch-analysis-ik-7.15.0.zip`,然后在Elasticsearch的根目录下运行命令`bin/elasticsearch-plugin install file:///path/to/downloaded/zip`。...
为了保证ELK堆栈的稳定运行,还需要考虑监控和维护方面,例如定期检查硬件资源使用情况,优化索引设置以提高性能,以及定期备份数据防止数据丢失。此外,对于安全性,需要设置合适的网络策略和用户权限,防止未授权...
**Elasticsearch 同义词插件详解** 在搜索引擎领域,Elasticsearch 是一款非常流行的开源全文搜索...总之,"elasticsearch-analysis-dynamic-synonym7.8.1"插件是优化Elasticsearch搜索性能,提升用户体验的重要工具。
Elasticsearch(ES)是一款基于Lucene的开源、分布式搜索分析引擎,它以其高效、灵活、可扩展的特性,在大数据时代广泛应用于日志分析、全文检索、监控等多种场景。版本7.4.2是Elasticsearch的一个稳定版本,提供了...
接着,为了优化Elasticsearch的性能和稳定性,需要调整系统的某些配置: 1. 修改`/etc/security/limits.conf`文件,增加对文件描述符和进程数量的限制,以便Elasticsearch能处理大量并发请求。 2. 调整`/etc/...
总的来说,"elasticsearch-analysis-ik-7.12.0.zip"是Elasticsearch在处理中文文本时不可或缺的工具,它为Elasticsearch提供了强大的中文分词功能,使得中文信息检索变得更加精准和高效。在Linux环境中,正确安装和...
- 倒排索引是Elasticsearch实现高效搜索的关键。它将每个文档的关键词映射到包含这些关键词的文档列表,使得搜索过程能够快速定位到目标文档。 3. **Lucene库** - Elasticsearch基于Apache Lucene构建,后者是一...
ElasticSearch Server是一本介绍分布式搜索开源框架的实用书籍,它详细阐述了如何使用ElasticSearch搭建高效率、可扩展的搜索...通过这本书,读者能够掌握如何使用ElasticSearch构建一个高效、稳定、可扩展的搜索平台。
5. **优化搜索体验**:为了提供更好的用户体验,可以使用Elasticsearch的过滤、排序、高亮显示等功能。过滤(Filter)用于精确匹配,而排序(Sorting)可以按照特定字段的值对结果进行排序。高亮显示(Highlighting...
通过以上步骤,你已经成功地将Elasticsearch与IKAnalyzer整合在一起,可以开始享受它带来的高效中文搜索体验了。在实际应用中,根据业务需求不断优化配置和调整策略,将有助于进一步提升系统的性能和用户体验。