gpt4 book ai didi

elasticsearch - 索引时文档的排序会提高 Elasticsearch 的搜索性能吗?

转载 作者:行者123 更新时间:2023-12-02 23:07:28 27 4
gpt4 key购买 nike

我正在将大约 40M 文档索引到 Elasticsearch 中。它通常是一次性的数据加载,然后我们在上面运行查询。索引本身没有进一步的更新。然而,Elasticsearch 的默认设置并没有让我获得预期的吞吐量。
因此,在一长串要调整和验证的事情中,我想知道按业务 key 排序是否有助于提高搜索吞吐量。我们所有的分析查询都使用这个键,它已经被索引为关键字,我们对其进行过滤,如下所示,

{
"query" : {
"bool" : {
"must" : {
"multi_match" : {
"type": "cross_fields",
"query":"store related query",
"minimum_should_match": "30%",
"fields": [ "field1^5", "field2^5", "field3^3", "field4^3", "firstLine", "field5", "field6", "field7"]
}
},
"filter": {
"term": {
"businessKey": "storename"
}
}

}
}
}
此查询在几个小时内以大约 2000 万次的批量方式运行。目前我不能超过 21k/min。但这可能是由于各种因素。任何提高此类工作流程性能的提示(加载一次并进行大量搜索)将不胜感激。
但是,我特别想知道在索引时是否可以先按业务键对数据进行排序,以便该业务键的数据存在于单个 Lucene 段中,因此查找会更快。这种思路对吗?考虑到它是关键字词,这是 ES 已经做过的事情吗?

最佳答案

这是一个非常好的性能优化用例,正如您已经提到的,会有一个您需要做的性能优化列表。
我可以看到,您已经在正确构建查询,即根据 businessKey 过滤记录而不是搜索剩余的文档,这样您就已经在使用 filter-cache Elasticsearch 。
由于您有大量文档 ~ 40M 文档,将它们全部放在单个段中是没有意义的,段的默认最大大小为 5 GB 及以上
merge进程将在段上被阻止,因此您几乎不可能只有 1 个段用于您的数据。
我认为您可以做的几件事是:

  • 完成提取数据并准备搜索索引后,禁用刷新间隔。
  • 当您使用过滤器时,应该使用您的 request_cache 并且您应该在查询时监控缓存使用情况并监控结果来自缓存的次数。
  • GET your-index/_stats/request_cache?human
  • 当您有更多副本时,读取吞吐量会更高,并且如果您的 Elasticsearch 集群中有节点,请确保这些节点具有 ES 索引的副本。
  • 监控每个节点上的搜索队列并确保它没有耗尽,否则您将无法增加吞吐量,请参阅 threadpools in ES更多信息

  • 你的主要问题是吞吐量,你想超过当前的 21k/min 限制,所以它也需要大量的索引和集群配置优化,我已经写了 short tips to improve search performance请引用他们,让我知道情况如何。

    关于elasticsearch - 索引时文档的排序会提高 Elasticsearch 的搜索性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64169684/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com