2010-07-23 44 views
3

我在使用以下字段類型查詢Solr的一個問題:Solr的SnowballPorterFilterFactory和通配符參數

<fieldType name="text_ci" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true"/> 
     <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
    </analyzer> 
</fieldType> 

正如你可以看到它應用「SnowballPorterFilterFactory」時,索引和查詢。如果我索引類似

老鼠的東西,好玩的

它得到的索引爲:

Index Breakdown in Solr

正如你可以看到這個詞「鼠標」變成「諒解備忘錄」通過「SnowballPorterFilterFactory」。這是我們想要的。然而,當我們搜索

鼠標*

它似乎並沒有以同樣的方式來應用「SnowballPorterFilterFactory」。我猜是因爲最後的*。

Query Breakdown in Solr

我的問題是..有沒有辦法使「SnowballPorterFilterFactory」瞭解通配符?所以,當我查詢了

鼠標*

我沒有得到0的結果。

有趣的是,如果我查詢

諒解備忘錄*

記錄不回來。

或者有人可以提供一個更好的方式來查詢/索引這種類型的字段?

感謝戴夫

回答

2

FAQ

與其他類型的Lucene查詢,通配符,前綴,以及模糊查詢不通過分析儀,這是執行諸如詞幹和lowercasing操作部件通過。跳過分析儀的原因是,如果您正在搜索「狗*」,您不希望「狗」首先被阻止爲「狗」,因爲那樣會匹配「狗*」,這不是預期的查詢。這些查詢無論如何都是不區分大小寫的,因爲QueryParser使它們成爲小寫。這種行爲可以使用setLowercaseExpandedTerms(boolean)方法

如果你沒事改變你的Solr源被改變,SOLR-757附加了一個補丁,你可能會發現有用。我不知道有什麼方法可以改變這種情況,只是潛入源中。

什麼可能是一個更簡單的想法:只是有一個不被阻止的副本字段。用戶可以搜索這兩個字段,然後鼠標*將在非字段中匹配。

(編輯:。其實,看着這個補丁,我不知道它會做你想要什麼,但基本上你只需要改變你的查詢處理程序先幹)

+0

謝謝...這回答了我爲什麼不應用過濾器的查詢。我喜歡複製領域的想法..謝謝 – CraftyFella 2010-07-29 14:22:24

2

我最後一次檢查,當您使用通配符時,不使用查詢分析器。因此,因爲您正在使用LowerCaseFilterFactory,所以您的術語以小寫索引,並且搜索Mous *將不會返回任何內容。

我認爲當你使用通配符時唯一要做的就是確保將你的查詢適應你的條件索引的方式(類似於你的查詢分析器所要做的)。

+0

黨..你是對的關於Mous *部分..讓我更新問題 – CraftyFella 2010-07-23 10:08:18

+0

第二段是處理solr中通配符的唯一方法嗎? – CraftyFella 2010-07-23 10:13:51