我们有一个双节点集群(私有云中的虚拟机,64GB的RAM,每个节点8个核心CPU,CentOS),一些小指数(约1万个文档)和一个大型索引文档(2个碎片,170GB的空间)。 24GB内存分配给每个盒子上的弹性搜索。ElasticSearch搜索性能
文档结构:
{
'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_expansion选项。其实我对查询FEED_ID一个条件过滤器,但我认为过滤器应用于结果集,搜索完成后,我想我是错的假设... – flext
只要你使用的是'过滤'查询来过滤它,过滤器将在查询本身之前应用(或多或少)。确切的顺序取决于ES内部的查询优化器,但您可以放心地将其视为“之前”。但是,如果您使用的是顶级过滤器,它将在查询后应用,并且不会获得良好的性能。 – Zach
好点,我使用顶级过滤器。我还在弹性搜索googlegroup中找到了关于过滤查询与顶级杠杆过滤器查询的解释。现在有很多意义。再次感谢! – flext