2010-08-05 53 views
7

我想要做的就是執行一個查詢並獲取不區分大小寫的結果並且匹配來自索引的部分單詞。在Solr中使用多個標記器

我有一個Solr模式設置在此刻被修改,以便我可以查詢並返回結果,無論他們是什麼情況。所以,如果我搜索iPOd,Iwill會看到iPod返回。要做到這一點的代碼是:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
    </analyzer> 
... 
</fieldType> 

我發現這個代碼,讓我們做一個局部的詞匹配查詢,但我不認爲我能有一個字段中的兩個斷詞。

<fieldType name="text" class="solr.TextField" > 
    <analyzer type="index"> 
    <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
... 
</fieldType> 

那麼我能做些什麼來在該字段上執行這個標記器呢?
或者有沒有辦法將它們合併?
或者有另一種方法可以完成這項任務嗎?

回答

7

聲明具有NGram分詞器的另一個字段類型(即不同的名稱),然後聲明一個字段,該字段使用帶有NGram的fieldType和具有標準「text」字段類型的另一個字段。使用copyField將一個複製到另一個。請參閱Indexing same data in multiple fields

+1

但現在該如何查詢,以便結果將顯示在用兩個標記器進行標記的數據中?換句話說 - 如何同時從兩個標記器獲得結果? – 2014-11-19 10:37:07

7

另一種方法是將EdgeGramFilterFacgtory應用到現有字段並保留在當前的標記器(WhitespaceTokenizerFactory)中,例如,

<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" /> 

這將保持當前的模式不變,即你不需要它有另一個標記生成器(NGramTokenizerFactory)

你現場看看,然後像下面的附加字段:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" /> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
    </analyzer> 
... 
</fieldType>