2010-05-06 21 views
5

我正試圖搜索姓氏的大名單上的部分開始匹配。所以的Wein *應該找溫伯格,Weinkamm等如何在Solr中進行部分初始匹配?

我可能會創建一個特殊的領域,schema.xml中添加

<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="50" preserveOriginal="1"/>

其類型規範做到這一點。當我只將上面的行添加到索引分析器並將查詢分析器保留爲空時,我可以通過搜索special_field:Wein進行搜索並獲得預期的結果。

現在我看到solr也有一個* - 語法。 EdgeNGramFilterFactory和* -syntax之間的連接是什麼?

我是否正確地做事,還是有更好,更規律的方式?

謝謝!

回答

1

我不推薦Wein *查詢。這在內部實現爲PrefixQuery,它重寫原始查詢以包含前綴等於「Wein」的所有術語。根據索引的大小(我的意思是有多少條),這個查詢重寫可能是一個瓶頸。

在索引時刻的EdgeNGramFilter是一個更好的方法。該解決方案將佔用更多空間,但查詢處理速度會更快。

+0

感謝。我不期望很多查詢條件,所以我使用通配符語法,並對它很滿意。 – CruftyCraft 2010-08-17 11:24:27

+0

我指的是索引術語的數量,而不是查詢術語。 Solr/Lucene對所有索引項進行線性搜索以選擇具有相同前綴的項的子集。一旦選擇了子集,查詢就會擴展爲包含這些條款。所以瓶頸是線性搜索。然後,我仍然推薦EdgeNGramFilter,除非你說你的索引中有幾個術語。 – Rodes 2010-08-17 20:50:42

+0

我明白了。一旦達到性能極限,我可能會在這個方向上做相同的改變。謝謝。 – CruftyCraft 2010-08-18 13:10:38

3

或者只是做一個簡單的外卡賽:

name:Pe*