2015-04-20 56 views
0

我們使用Lucene 4.7來構建和查詢一個相當大的數據集(110多萬個文檔)。Lucene中多值字段的性能問題

一個文檔字段,這是我們用於刻面的,被定義爲如下:

<field name="topic_paths" 
     type="string" 
     indexed="false" 
     stored="false" 
     docValues="true" 
     multiValued="true" 
     termVectors="false" 
     termPositions="false" 
     termOffsets="false"/> 

每當我們包括在查詢這個領域中,它們變得非常慢:包括在每topic_path值大約7秒搜索,所以大約30秒,四個topic_path值(在我們的例子中是典型值)。

不使用此字段的查詢速度非常快(15毫秒)。

我們應該期望從Lucene的多值字段用於分面的性能嗎?我們的字段定義是否有錯誤或不理想?我們可以使用哪些技巧來加速搜索?

詳情:

  • 硬件:Xen的虛擬機,8核至強CPU E5-2670 V2在2.5千兆赫,64 GB RAM
  • 操作系統:Windows Server 2012標準
  • JVM:開始 - Xmx8000m(Lucene的是使用的約45%)
  • Lucene的查詢是單線程
+0

我猜是這樣peformance依賴於OS filecache效率方面將使用docValues。當你提取分面時,你看到很多IO嗎?如果第二次運行相同的查詢會更快嗎?你給java(Xmx)多少堆空間? – nomoa

+0

如果我第二次運行完全相同的查詢,它是即時的(感謝我所假設的查詢緩存)。我還不知道有多少磁盤流量查詢會生成,因爲由於某種原因,Process Explorer中的I/O計數器被鎖定爲0.但是查詢似乎是CPU綁定的。讓我補充一點,單個查詢正在運行單線程。我們將'-Xmx8000m'傳遞給JVM; Lucene似乎正在使用其中的45%。 –

+0

我猜這是一個溫暖os文件緩存的問題。你可以嘗試運行一個具有方面的長MatchAllQuery,並查看所有後續的方面查詢是否更快?您還可以檢查虛擬內存使用情況。 – nomoa

回答

1

閱讀本文,http://wiki.apache.org/solr/SchemaXml#Fields

你需要「指數」你,包括它變成搜索/刻面現場,否則將Solr的跳過此領域沒有任何異常

+0

我們嘗試設置'indexed =「true」',但是這對性能沒有影響。據我所知,當設置'docValues ='true''時,'indexed =「true」'是多餘的。 –

+0

我們通過切換到Elasticsearch解決了我們的問題。 –

+1

如果您直接移植安裝程序,Elasticsearch將具有相同的性能問題,因爲它們都使用Lucene進行核心搜索。你的問題只是由於改變設置而解決的。index = true是正確的答案:在你指定之後,你是否重新編制索引? –