2015-12-14 35 views
1

我有一個導軌4應用程序在運行的schema.xml黑子的Solr與以下濾鏡的Solr沒有找到子串

<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.NGramFilterFactory" minGramSize="1" maxGramSize="10"/> 
    <filter class="solr.TrimFilterFactory" /> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.StandardFilterFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.PorterStemFilterFactory"/> 
    <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="10"/> 
    <filter class="solr.TrimFilterFactory" /> 
    </analyzer> 
</fieldType> 

我有一個名爲「拉普德茲」我wan't城市被solr發現。 只要您開始輸入Alpe,Solr就會發現這條記錄,但我希望只需在「huez」中輸入即可找到它 這怎麼能實現?感謝您的幫助

回答

2

請嘗試下面的配置,如果搜索詞包含特殊字符,則在雙引號內輸入搜索詞。

<fieldType name="search" class="solr.TextField" positionIncrementGap="150"> 
    <analyzer type="index"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="50"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 
+0

此配置的偉大工程!非常感謝。你能解釋一下爲什麼不使用EdgeNGramFilterFactory有什麼不同? – dc10

+0

EdgeNGramFilterFactory從標記的起點創建n-gram,而NGTF從兩端創建n個標記。
例如正克比較兩個factories-
令牌的招呼
EedgeNGFF:H,他,HEL,地獄,你好
NGFF:H,他,HEL,地獄,你好,hellow,E,埃爾,埃爾,ELLO, ellow,L,LL,LLO,llow,L,LO,低,鄰 –

1

對,您的分析看起來有點可疑。

首先,它是最典型的查詢和指標分析儀是相同的,或接近(這不是一個硬性規定,但如果他們分歧,你應該知道爲什麼)。如果它們太不相同,查詢條件將與索引條款不匹配,並且您通常不會得到任何結果。

同時使用EdgeNGramFilterFactory 很奇怪。本質上,你將令牌分成ngram,並從你的ngram中分出ngram。這不會讓我覺得特別有用,除非你真的打算採用獵槍方式進行搜索。

您在查詢時間分析中應用了詞幹分析器(PorterStemFilterFactory),但沒有在索引時間應用。你應該在兩個時間都應用它,因爲它很有用。

此外,NGrams和Stemmers並不真正在一起玩。如果你需要使用兩者,你​​可能應該在不同領域編制索引。

和小點TrimFilterFactory:它實際上並沒有做任何事情。您正在使用StandardTokenizer,所以輸入已被分割爲空白。 TrimFilterFactory對除關鍵字分析字段以外的任何內容都很少有用。

如果你不知道你需要分析,這可能是最有用的只是標準開始分析:

<fieldType name="text" class="solr.TextField" omitNorms="false"> 
    <analyzer type="index" class="org.apache.lucene.analysis.standard.StandardAnalyzer"/> 
    <analyzer type="query" class="org.apache.lucene.analysis.standard.StandardAnalyzer"/> 
</fieldType> 

,並從那裏。

否則,這樣的事情可能是最接近您提供什麼似乎很合理:

<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.NGramFilterFactory" minGramSize="1" maxGramSize="10"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.StandardFilterFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="10"/> 
    </analyzer> 
</fieldType>