2011-12-21 96 views
0

單詞的單數形式我有一個Rails +太陽黑子的應用和我的工作,使搜索返回查詢的singluar版本配置它。例如:發現太陽黑子/ Solr的

我想搜索「cookies」以返回名爲「cookie」的內容。目前我的太陽黑子搜索返回「cookies」,但不是「cookie」(單身)。

我已經對Solr的schema.xml進行了一些自定義,增加了solr.EdgeNGramFilterFactory以提供更多的靈活性,但EdgeNGramFilterFactory沒有包含這種情況,因爲只有當查詢是結果名稱的子字符串時才允許匹配。我的理解是當用戶搜索「co」,「coo」,「cook」或「cooki」,而不是「cookie」的超字符串(即:cookies)時,EdgeNGramFilterFactory將返回「cookie」。簡而言之,這是因爲「cookies」不是「cookie」中的子字符串。

我已經嘗試添加三個Solr的強大的內置在制止工廠,但無濟於事。你可以在我的模式中看到一個註釋。

schema.xml中,相關領域如下所示:

<fieldType name="text" class="solr.TextField" omitNorms="false"> 
    <analyzer type="index"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.StandardFilterFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/> 
    <!-- <filter class="solr.EnglishMinimalStemFilterFactory"/> --> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.StandardFilterFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

我認爲我可以singluarize用戶的查詢,但它擊中的Solr之前,我寧願不碰他們的查詢。

你可以在這裏玩這個:http://staging.zisboombah.com/parent/food_guide/?search=cookie。嘗試改變「cookie」和「cookies」之間的查詢。

有關如何在Solr中做到這一點的任何提示將不勝感激!

回答

2

訂購solr xml選項。您希望stemmer在ngram過濾器之前出現,這樣您就可以將ngram-iize cooki而不是干擾c,co等。

以這種方式組合過濾器可能會導致一些奇怪的結果,主要取決於您的攻擊程度詞幹是。您應該將查詢分析器添加到查詢分析器中,但這會與您的自動完成相混淆。

更好的解決方案:使用copyField做出獨立text_stemmed和text_autocomplete領域。然後使用兩個字段上的OR查詢進行搜索。

+0

感謝凱爾!你有任何可以進一步解釋copyField的資源的鏈接嗎?也許是一個例子? – Mike 2011-12-22 21:31:19

+0

在另一個答案[下面]中擴展了這個概念(http:// stackoverflow。com/questions/8596826 /發現 - 單詞在太陽黑子 - solr/8706740#8706740)(太長的評論)。 – 2012-01-03 00:31:47

0

像凱爾mentions,你可能想使用更多的文本字段類型每一種不同的使用情況。

下面是一個煤礦的例子:使用copyField指令可以保存在模型中的一些設置工作

schema.xml

<schema> 
    <types> 

    <fieldType name="text" class="solr.TextField" omitNorms="false"> 
     <analyzer> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StandardFilterFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     </analyzer> 
    </fieldType> 

    <fieldType name="text_en" class="solr.TextField" omitNorms="false"> 
     <analyzer> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StandardFilterFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
     </analyzer> 
    </fieldType> 

    <fieldType name="text_stopwords" class="solr.TextField" omitNorms="false"> 
     <analyzer> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StandardFilterFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/> 
     </analyzer> 
    </fieldType> 

    <!-- ... --> 
    </types> 
    <fields> 
    <!-- ... --> 
    </fields> 

    <copyField source="*_text" dest="text"/> 
    <copyField source="*_texts" dest="text"/> 
    <copyField source="*_textsv" dest="text"/> 
    <copyField source="*_textv" dest="text"/> 

</schema> 

Sunspot modeling

。然而,太陽黑子使用這些text聲明,以決定哪些字段keywords - 搜索默認情況下,所以我想包括不同text調用使用:as指定完整的Solr文檔字段名。

searchable do 
    text :name, stored: true, default_boost: 10 
    text :name, as: 'name_text_en' 
    text :description, stored: true 
end 
+0

謝謝尼克!我花了幾個小時與你的建議無濟於事。我已經嘗試了許多http://pastie.org/3204079的迭代。我現在面臨的問題是,stemmer工程,但EdgeNGramFactory似乎並沒有。現在,「cookies」將返回「cookie」(我想要的結果)。但是,「cook」不會返回「cookie」。此外,我存儲在我的記錄「名稱」字段返回零(所有其他存儲的字段都很好)。我的模型代碼如下所示: text:name,:boost => 2.0,:stored => true; text:name,:as =>'name_text_en' – Mike 2012-01-17 22:28:27