2013-11-20 107 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