2012-11-17 123 views
0

鑑於我有一個模型與太陽黑子

class Firm < ActiveRecord::Base 
    searchable do 
    text :name 
    end 
end 

和Solr的schema.xml中的部分搜索中包含

<fieldType name="text" class="solr.TextField" omitNorms="false"> 
    <analyzer> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.StandardFilterFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="30"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.StandardFilterFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

而且我有一個堅定的與名==「Ойл-М(油-M) 「

當我嘗試搜索

Sunspot.search(Firm) do 
    fulltext 'Ойл-М' 
end 

ŧ母雞我得到什麼

當我嘗試搜索

Sunspot.search(Firm) do 
    fulltext 'Ойл' 
end 

接着,我會需要企業

我應該如何設置Solr的和/或搜索能夠通過這兩個查詢發現這家企業?

回答

3

你的NGramFilter正在切斷最後的'M',因爲你有minGramSize=2。設置minGramSize=1可以工作,但這會大大增加Solr必須存儲的數據的大小,並且還會增加噪音。

當指數和Solr的問題涉及的領域,兩件事情發生:

  1. 場被分割成小塊(符號化),然後
  2. 每個標記過濾。

發生這種情況分別發生索引和查詢。

在這種情況下,您使用StandardTokenizerFactory,StandardFilter,LowercaseFilter和一個NGramFilter將字段編入索引,並且除了NGramFilter以外的所有內容查詢該字段。

當您將「Ойл-М(Oil-M)」索引到Solr中時,發生了什麼情況。

StandardTokenizerFactory: ['Ойл', 'М', 'Oil', 'M'] 
StandardFilter: ['Ойл', 'М', 'Oil', 'M'] 
LowerCaseFilter: ['ойл', 'м', 'oil', 'm'] 
NGramFilter: ['ой', 'йл', 'ойл', 'oi', 'il', 'oil'] 

'm'完全脫落。搜索「Ойл-М」不會返回任何內容,因爲沒有M要搜索

刪除NGramFilter,除非你有很好的理由使用它,並堅持使用標準的俄羅斯fieldType。

<fieldType name="text_ru" class="solr.TextField" positionIncrementGap="100">                
    <analyzer>                                
    <tokenizer class="solr.StandardTokenizerFactory"/>                     
    <filter class="solr.LowerCaseFilterFactory"/>                      
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ru.txt" format="snowball" enablePositionIncrements="~ 
    <filter class="solr.SnowballPorterFilterFactory" language="Russian"/>                
    </analyzer>                               
</fieldType> 

注意:請注意,索引分析器和查詢分析器之間沒有區別。每個查詢都以與索引時完全相同的方式進行轉換。

+0

帕特里夏,你救了我的一天!謝謝! –