elasticsearch 优化并行查询的Elasticsearch,elasticsearch,apache-spark,lucene,full-text-search,elasticsearch,Apache Spark,Lucene,Full Text Search" /> elasticsearch 优化并行查询的Elasticsearch,elasticsearch,apache-spark,lucene,full-text-search,elasticsearch,Apache Spark,Lucene,Full Text Search" />

elasticsearch 优化并行查询的Elasticsearch

elasticsearch 优化并行查询的Elasticsearch,elasticsearch,apache-spark,lucene,full-text-search,elasticsearch,Apache Spark,Lucene,Full Text Search,我在AWS EMR中运行的20节点Elasticsearch集群上得到了大约3gb的索引。索引有5个碎片,复制了4次。底层数据是书籍,但我已经根据格式将它们分为段落或行块,因此大约有2700万个文档。索引只需约5分钟 我想在索引中搜索大约1500万个短语 搜索逻辑是一个4层瀑布,一旦找到结果就会停止:精确匹配=>编辑距离为1的模糊匹配=>编辑距离为2的模糊匹配=>部分短语匹配。我把它分解成这样,这样我就可以通过一些质量指标来筛选匹配项 为了分发和执行搜索,我使用了Spark 我发现最快的搜索速度

我在AWS EMR中运行的20节点Elasticsearch集群上得到了大约3gb的索引。索引有5个碎片,复制了4次。底层数据是书籍,但我已经根据格式将它们分为段落或行块,因此大约有2700万个文档。索引只需约5分钟

我想在索引中搜索大约1500万个短语

搜索逻辑是一个4层瀑布,一旦找到结果就会停止:精确匹配=>编辑距离为1的模糊匹配=>编辑距离为2的模糊匹配=>部分短语匹配。我把它分解成这样,这样我就可以通过一些质量指标来筛选匹配项

为了分发和执行搜索,我使用了Spark

我发现最快的搜索速度是每秒420个短语,这意味着整个任务需要10-12个小时

我的问题是:这是合理的搜索率吗

如果我将整个索引放在一个碎片上,并在每个节点上复制完整索引,我会获得更好的性能吗?或者我应该去另一个方向,增加切分级别?我怀疑这两个问题的答案将是“两个都试试!”,从长远来看,我可能会这样做,但我有一个短期的期限,我正试图优化,所以我想看看是否有其他人有过类似的问题

我很乐意根据需要提供更多细节


抱歉,如果这不是主题-我没有找到关于Elasticsearch这种用例的大量文档。

在20个节点上只有3gb的数据是一种资源浪费。如果您有一个5分片索引,请仅从5个节点开始。见鬼,3gb是如此之小,以至于你甚至可以让索引只包含一个碎片并在一个节点上运行

幸运的是,只需5分钟即可为所有数据编制索引,因为您可以快速找到合适的集群大小,以最佳方式运行查询。从一个节点上的一个主碎片(无副本)开始,然后添加一个副本和另一个节点,以此类推

然后从两个主碎片和两个节点开始,添加副本和节点等

对于每个测试,测量它的运行速度,在某个时间点(即一两天内),您将找到适合您的搜索需求的确切集群大小

更新


如果每个节点有32个CPU,则可以有一个节点和20个碎片。在每次搜索过程中,每个CPU都会愉快地处理一个碎片,聚合结果的网络聊天将更少,而且“应该”更快。我一定会尝试一下。

同意-这20个节点是增加搜索并行容量所必需的-如果没有这些,一切都是一样的,每秒340次搜索将下降到每秒85次搜索。所以基本上你有20个碎片和20个节点,所以每个节点一个碎片,对吗?每个节点上有多少个CPU?如果每个节点有32个CPU,则可以有一个节点和20个碎片。在每次搜索过程中,每个CPU都会愉快地处理一个碎片,聚合结果的网络聊天将更少,而且“应该”更快。我一定会尝试一下。回答+1和你的第二条评论。我还认为,你的答案中应该包含投票结果较高的评论。谢谢@eliasah,这很有意义,我已经相应地更新了我的答案