[ElasticSearch2.x]Filter之Cache

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 过滤器(Filter)的核心实际是采用一个bitset记录与过滤器匹配的文档。当Elasticsearch确定一个bitset可能会在将来被重用时,它将被直接缓存在内存中供以后使用。

过滤器(Filter)的核心实际是采用一个bitset记录与过滤器匹配的文档。当Elasticsearch确定一个bitset可能会在将来被重用时,它将被直接缓存在内存中供以后使用。一旦缓存,这些bitset可以在使用相同查询的任何地方重复使用,而无需再次重新评估整个查询。

这些缓存的bitset是非常“机智”的:它们是增量更新的。 在索引新文档时,只需要将那些新文档添加到现有的bitset中,而不必一遍一遍地重新计算全部已经缓存的过滤器(rather than having to recompute the entire cached filter over and over. )。 过滤器与系统的其余部分都是实时的,不需要担心缓存过期问题。

1. 独立的查询缓存(Query Caching)

属于一个查询组件的bitsets独立于搜索请求的其他部分(The bitsets belonging to a query component are independent from the rest of the search request)。 这意味着,一旦缓存,可以在多个搜索请求中重复使用查询。 它不依赖于它所存在的查询上下文。 这样使得缓存可以加速查询中经常使用的部分,而不会在较少或易变部分浪费开销。

类似地,如果单个搜索请求重复使用相同的非评分查询,则其缓存的bitset可以重用于单个搜索请求内的所有实例。

我们来看看下面这个示例查询,它查找以下任何一个电子邮件:

  • 在收件箱中,且没有被读过的
  • 不在 收件箱中,但被标注重要的
GET /inbox/emails/_search
{
  "query": {
      "constant_score": {
          "filter": {
              "bool": {
                 "should": [
                    { "bool": {
                          "must": [
                             { "term": { "folder": "inbox" }}, 
                             { "term": { "read": false }}
                          ]
                    }},
                    { "bool": {
                          "must_not": {
                             "term": { "folder": "inbox" } 
                          },
                          "must": {
                             "term": { "important": true }
                          }
                    }}
                 ]
              }
            }
        }
    }
}

使用SQL语句描述:

SELECT emails
FROM inbox
WHERE (folder='inbox' and read = false) or (folder != 'inbox' and important = true)

上面两个查询是相同的,并且将使用相同的bitset

尽管一个inbox子句是一个must子句,另一个是一个must_not子句,但是这两个子句本质上是一样的。如果这个特定term查询先前已被缓存过,那么尽管这两个子句使用不同样式的布尔逻辑,也都将受益于缓存表示(If this particular term query was previously cached, both instances would benefit from the cached representation despite being used in different styles of boolean logic)。

这点与查询表达式的组合性很好的相关联。 可以轻松地移动过滤查询,或在搜索请求中的多个位置重复使用相同的查询。 这对开发人员来说不仅方便,而且具有直接的性能优势。

2. 自动缓存(Autocaching Behavior)

在旧版本的Elasticsearch中,默认行为是缓存可缓存的所有内容。 这通常意味着系统缓存的bitset太冒进,在清理缓存时会给性能带来冲击。 此外,许多过滤器可以非常快速地进行评估,但是缓存(从缓存重用)的速度要慢的多。 这些过滤器没有必要进行缓存,因为再次重新执行过滤器都比从缓存重用快。

检查一个倒排索引是非常快的,但是绝大多数查询组件却很少使用它(Inspecting the inverted index is very fast and most query components are rare.)。例如 在 "user_id"字段上的term 过滤 :如果有上百万的用户,每个具体的用户 ID 出现的概率都很小。那么为这个过滤器缓存bitsets 就不是很合算,因为缓存的结果在重用之前很可能就被剔除了。

这种缓存流失(cache churn )可能会对性能造成严重影响。 更糟糕的是,开发人员很难确定哪些组件具有良好的缓存行为,哪些组件的缓存行为没有用处。

为了解决这个问题,Elasticsearch会根据使用频率自动缓存查询。 如果一个非评分查询在最近的256次查询中使用了多次(取决于查询类型),则该查询是被候选缓存。但是,并不是所有段都保证缓存bitset。 只有拥有超过10,000个文档的分段(或占文档总数的3%以上)将缓存bitset。 因为小段可以快速的搜索和合并,所以在这种情况下缓存bitset是没有意义的。

一旦缓存,非评分计算的bitset会一直驻留在缓存中直到它被剔除。剔除规则是基于 LRU 的:一旦缓存满了,最近最少使用的过滤器会被剔除。

原文:https://www.elastic.co/guide/en/elasticsearch/guide/current/filter-caching.html#_autocaching_behavior

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
3月前
|
存储 缓存 大数据
Elasticsearch Filter 缓存加速检索的细节,你知道吗?
【8月更文挑战第23天】在大数据和全文检索领域,Elasticsearch(ES)凭借其高性能和可扩展性成为众多企业的首选。而在实际应用中,如何通过优化查询来提升检索效率,是每个开发者都需要关注的话题。其中,Filter 缓存作为一种有效的性能优化手段,在Elasticsearch中扮演着重要角色。本文将深入探讨Elasticsearch Filter 缓存的工作原理、优势及实现细节,为你在工作和学习中提供实用的技术干货。
47 0
|
3月前
|
存储 缓存 监控
Elasticsearch Filter 缓存加速检索的细节,你知道吗?
【8月更文挑战第15天】在大数据与搜索引擎的广阔天地里,Elasticsearch 凭借其强大的全文搜索能力和可扩展性,成为了众多企业和开发者的首选。而在Elasticsearch的性能优化中,Filter缓存(也称为Filter Cache,自Elasticsearch 7.x版本后更名为Query Cache的一部分)扮演着至关重要的角色。今天,我们就来深入探讨一下Elasticsearch Filter缓存如何加速检索过程,以及在日常工作学习中如何有效利用这一特性。
66 0
|
3月前
|
缓存 自然语言处理 Java
ElasticSearch 实现分词全文检索 - filter查询
ElasticSearch 实现分词全文检索 - filter查询
43 0
|
5月前
|
缓存 自然语言处理 监控
elasticsearch过滤器filter:原理及使用
elasticsearch过滤器filter:原理及使用
|
5月前
|
Linux
elasticsearch启动报错:unable to install syscall filter: java.lang.UnsupportedOperationException: seccomp
elasticsearch启动报错:unable to install syscall filter: java.lang.UnsupportedOperationException: seccomp
37 0
|
6月前
|
索引
说说 Elasticsearch filter 和 post_filter 的区别?
说说 Elasticsearch filter 和 post_filter 的区别?
54 0
|
缓存 自然语言处理 监控
白话Elasticsearch52-深入聚合数据分析之fielddata内存控制、circuit breaker短路器、fielddata filter、预加载机制以及序号标记预加载
白话Elasticsearch52-深入聚合数据分析之fielddata内存控制、circuit breaker短路器、fielddata filter、预加载机制以及序号标记预加载
127 0
|
数据挖掘
白话Elasticsearch42-深入聚合数据分析之案例实战__bucket filter:统计牌品最近一个月的平均价格(Filter Aggregation)
白话Elasticsearch42-深入聚合数据分析之案例实战__bucket filter:统计牌品最近一个月的平均价格(Filter Aggregation)
137 0
|
SQL 索引
白话Elasticsearch03- 结构化搜索之基于bool组合多个filter条件来搜索数据
白话Elasticsearch03- 结构化搜索之基于bool组合多个filter条件来搜索数据
299 0
|
缓存 索引
白话Elasticsearch02- 结构化搜索之filter执行原理bitset机制与caching机制
白话Elasticsearch02- 结构化搜索之filter执行原理bitset机制与caching机制
95 0