2013-11-20 193 views
2

我们有一个双节点集群(私有云中的虚拟机,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"] 
} 

我们是打在这一点上硬件的限制,还是有方法来优化查询或数据结构来提高性能?

在此先感谢!

回答

6

您可能遇到了硬件限制,但您可以先对查询进行一些操作以帮助优化它。

最大扩展

我会做的第一件事是限制max_expansions。前缀查询的工作方式是通过生成匹配查询中最后一个标记的前缀列表。在您的搜索查询“某个搜索字词”中,最后一个字词“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"], 

} 

你必须与你要多少扩展玩。这是速度和召回之间的折衷。

过滤

在一般情况下,你可以添加其他的事情是过滤。如果您可以过滤某些类型的标准,则可能会大大提高速度。目前,您的查询正在针对整个索引(250米文档)执行,这是一个值得评估的问题。如果您可以添加过滤器来减少该数量,则可以看到大大改善的延迟。

在一天结束时,查询评估的文档越少,查询运行得越快。过滤器减少文档,一个查询可以看到,被缓存的数量,运行速度非常快,等等等等

你的情况可能不会有任何适用的过滤器,但如果这样做,他们可以真正帮助!

文件系统缓存

这个建议是完全依赖于系统的其余部分。如果由于您正在进行简单的搜索和过滤(例如,不是面/地理/重排序/脚本)而无法充分利用堆(24GB),则可以将堆重新分配给文件系统缓存。

例如,如果在您的12GB最大堆的使用高峰,它可能是有意义的减少堆大小到15GB。您释放的额外10gb将返回到操作系统并帮助缓存段,这将有助于提高搜索性能,因为更多操作是无盘的。

+0

谢谢您的回答,我会玩的max_expansion选项。其实我对查询FEED_ID一个条件过滤器,但我认为过滤器应用于结果集,搜索完成后,我想我是错的假设... – flext

+1

只要你使用的是'过滤'查询来过滤它,过滤器将在查询本身之前应用(或多或少)。确切的顺序取决于ES内部的查询优化器,但您可以放心地将其视为“之前”。但是,如果您使用的是顶级过滤器,它将在查询后应用,并且不会获得良好的性能。 – Zach

+0

好点,我使用顶级过滤器。我还在弹性搜索googlegroup中找到了关于过滤查询与顶级杠杆过滤器查询的解释。现在有很多意义。再次感谢! – flext