我正在尝试提高查询性能。对于甚至不涉及嵌套文档的简单查询,平均需要大约 3 秒,有时会更长。
curl "http://searchbox:9200/global/user/_search?n=0&sort=influence:asc&q=user.name:Bill%20Smith"
即使没有排序也需要几秒钟。以下是集群的详细信息:
1.4TB index size.
210m documents that aren't nested (About 10kb each)
500m documents in total. (nested documents are small: 2-5 fields).
About 128 segments per node.
3 nodes, m2.4xlarge (-Xmx set to 40g, machine memory is 60g)
3 shards.
Index is on amazon EBS volumes.
Replication 0 (have tried replication 2 with only little improvement)
我没有看到 CPU/内存等任何明显的峰值。有什么想法可以改进吗?
最佳答案
Garry 关于堆空间的观点是正确的,但这里的问题可能不是堆空间。
使用您当前的配置,对于 1.5 TB 的索引,您将拥有不到 60GB 的可用页面缓存。由于页面缓存中的索引不到 4.2%,因此您很可能需要在大多数搜索中访问磁盘。
您可能希望为集群添加更多内存,并且还需要仔细考虑分片的数量。仅坚持默认值可能会导致分布偏斜。在这种情况下,如果您有五个分片,那么您将拥有两台机器,每台机器拥有 40% 的数据,而第三台机器只有 20%。无论哪种情况,在进行分布式搜索时,您都将始终等待最慢的机器或磁盘。这篇关于 Elasticsearch in Production 的文章更深入地探讨了如何确定合适的内存量。
不过,对于这个精确的搜索示例,您可能可以使用过滤器。您正在排序,因此忽略了查询计算的分数。使用过滤器,它会在第一次运行后被缓存,随后的搜索会很快。
关于java - Elasticsearch 提高查询性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22223705/