我們使用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的查詢是單線程
我猜是這樣peformance依賴於OS filecache效率方面將使用docValues。當你提取分面時,你看到很多IO嗎?如果第二次運行相同的查詢會更快嗎?你給java(Xmx)多少堆空間? – nomoa
如果我第二次運行完全相同的查詢,它是即時的(感謝我所假設的查詢緩存)。我還不知道有多少磁盤流量查詢會生成,因爲由於某種原因,Process Explorer中的I/O計數器被鎖定爲0.但是查詢似乎是CPU綁定的。讓我補充一點,單個查詢正在運行單線程。我們將'-Xmx8000m'傳遞給JVM; Lucene似乎正在使用其中的45%。 –
我猜這是一個溫暖os文件緩存的問題。你可以嘗試運行一個具有方面的長MatchAllQuery,並查看所有後續的方面查詢是否更快?您還可以檢查虛擬內存使用情況。 – nomoa