[英]ElasticSearch search perfomance
我们有两个节点的集群(私有云中的VM,64GB的RAM,每个节点8个核心CPU,CentOS),几个小索引(约100万个文档)和一个大索引,约有2.2亿个文档(2个分片,170GB)的空间)。 每个盒上分配了24GB的内存用于弹性搜索。
文件结构:
{
'article_id': {
'index': 'not_analyzed',
'store': 'yes',
'type': 'long'
},
'feed_id': {
'index': 'not_analyzed',
'store': 'yes',
'type': 'string'
},
'title': {
'index': 'analyzed',
'type': 'string'
},
'content': {
'index': 'analyzed',
'type': 'string'
},
'lang': {
'index': 'not_analyzed',
'type': 'string'
}
}
运行以下查询大约需要1-2秒:
{
"query" : {
"multi_match" : {
"query" : "some search term",
"fields" : [ "title", "content" ],
"type": "phrase_prefix"
}
},
"size": 20,
"fields" :["article_id", "feed_id"]
}
我们是在此时达到硬件极限,还是有办法优化查询或数据结构以提高性能?
提前致谢!
您可能会达到硬件的极限,但是首先可以对查询做一些事情来帮助优化它。
最大扩展
我要做的第一件事是限制max_expansions
。 前缀查询的工作方式是生成与查询中的最后一个令牌匹配的前缀列表。 在您的搜索查询“ some search term”中,最后一个标记“ term”将使用“ term”作为前缀种子进行扩展。 您可以生成如下列表:
前缀扩展过程贯穿您的发布列表,以查找与种子前缀匹配的任何单词。 默认情况下,此列表是无限制的,这意味着您可以生成很大的扩展列表。
第二阶段使用扩展将原始查询重写为一系列term
查询。 扩展列表越大,针对您的索引评估的术语越多,并且速度相应降低。
如果将扩展过程限制在合理范围内,则可以保持速度,并且通常仍会获得良好的前缀匹配:
{
"query" : {
"multi_match" : {
"query" : "some search term",
"fields" : [ "title", "content" ],
"type": "phrase_prefix",
"max_expansions" : 100
}
},
"size": 20,
"fields" :["article_id", "feed_id"],
}
您将需要尝试多少个扩展。 这是速度和召回之间的权衡。
过滤
通常,您可以添加的另一件事是过滤。 如果您可以过滤某些类型的条件,则可以极大地提高速度。 当前,您的查询是针对整个索引(2.5亿个文档)执行的,需要进行大量评估。 如果您可以添加过滤器以减少该数量,则可以看到延迟大大改善了。
最终,查询评估的文档越少,查询运行的速度就越快。 过滤器减少了查询将看到,被缓存,运行非常快等的文档数量。
您的情况可能没有任何适用的过滤器,但如果有,它们确实可以提供帮助!
文件系统缓存
该建议完全取决于系统的其余部分。 如果由于进行简单的搜索和过滤(例如,不分面/地理/繁杂的排序/脚本)而没有充分利用堆(24gb),则可以将堆重新分配给文件系统缓存。
例如,如果最大堆使用量峰值为12gb,则可以将堆大小减小到15gb。 您释放的额外10gb将返回到操作系统并帮助缓存段,这将仅由于更多操作是无盘事实而有助于提高搜索性能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.