performance - 在 Elasticsearch 中使用过滤器搜索别名非常慢

标签 performance search elasticsearch

我有一个 elasticsearch 索引,my_index,包含数百万个文档,键为 my_uuid。在该索引之上,我有几个以下形式的过滤别名(仅显示my_alias,由GET my_index/_alias/my_alias 检索):

{
    "my_index": {
        "aliases": {
            "my_alias": {
                "filter": {
                    "terms": {
                        "my_uuid": [
                            "0944581b-9bf2-49e1-9bd0-4313d2398cf6",
                            "b6327e90-86f6-42eb-8fde-772397b8e926",
                            thousands of rows...
                        ]
                    }
                }
            }
        }
    }
}

我的理解是过滤器会为我透明地缓存,不需要做任何配置。问题是,在通过别名时,我的搜索速度非常慢,这表明 1.过滤器未缓存,或 2.写错了

指示数字:

GET my_index/_search -> 50ms 
GET my_alias/_search -> 8000ms

如果有人认为相关,我可以提供有关集群规模和数据大小的更多信息。

我正在使用 elasticsearch 2.4.1。我得到了正确的结果,这只是我关心的表现。

最佳答案

将每个文档与 4MB 的 uid 列表匹配绝对不是可行的方法。试着想象一下它需要多少个 CPU 周期。 8s 相当快。

我会在另一个索引中复制数据子集。

如果您需要立即反射(reflect)更改,则必须手动管理子集索引:

  • 当您从列表中删除一个 uuid 时,您会删除相应的文件
  • 当你添加一个 uuid 时,你复制相应的文件(reindex api with a query 是你的 friend )
  • 当你插入一个文档时,你必须检查该文档是否也应该被添加到子集索引中
  • 当你删除一个文档时,在两个索引中都删除它 强制文档 ID,以便它们在两个索引中相同。如果将 uuid 列表存储在 elasticsearch 索引中,请注意刷新时间。

如果使用新的 uuid 更新子集不是时间紧迫的,您可以每天或每小时运行重新索引。

关于performance - 在 Elasticsearch 中使用过滤器搜索别名非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42135496/

相关文章:

performance - 小数相加比大数相加快吗?

performance - Data.Text.Lazy.Builder 与 Text.Builder

c# - 从 ObservableCollection<t>.Where 获取索引和对象

elasticsearch - Solr和Elasticsearch中处理日志和PDF的比较以及Banana和Kibana中的数据可视化

elasticsearch - Elasticsearch和Lucene文档限制

Elasticsearch - 为什么建议为堆使用 50% 的可用内存?

c - 您在我提供的代码中选择一种代码而不是另一种代码的原因是什么?有什么建议可以改进它们吗?

mysql - 提高长 VARCHAR 字段的排序性能

php - 如果搜索结果不存在则隐藏表

javascript - 如何在没有找到结果时使用 javascript 和 list.js 在搜索中显示 'no result found'