2016-01-07 49 views
0

下面的問題涉及使用SOLR(4.9.0)和Haystack的Django應用程序(1.8.8)。SOLR Haystack分裂數字

我需要搜索的數據包含各種字符串,如「A1234」和「ABCDE1」;這些字符串將同時在「文本」和「名」定義字段轉起來如下:

name = indexes.CharField(indexed=True, model_attr="name") 
text = indexes.EdgeNgramField(document=True, use_template=True) 

如果上面的字符串中的一個,則文本字段中搜索它不會被發現,但沒有在名稱字段中搜索問題。如果我在文本字段中搜索時省略了字母(例如,我搜索「1234」),那麼我可以找到我要查找的內容。

直接與調試啓用顯示,這些字符串被分割查詢SOLR服務器:

// text field - no hits 
rawquerystring: "A1234", 
querystring: "A1234", 
parsedquery: "+text:a +text:1234", 
parsedquery_toString: "+text:a +text:1234", 
explain: { }, 
QParser: "LuceneQParser", 

// name field - finds the correct records 
rawquerystring: "name:A1234", 
querystring: "name:A1234", 
parsedquery: "name:a1234", 
parsedquery_toString: "name:a1234", 
explain: { }, 
QParser: "LuceneQParser", 

有關edge_ngram字段(以上是這樣的文本字段)schema.xml中的部分如下:

<fieldType name="edge_ngram" class="solr.TextField" positionIncrementGap="1"> 
    <analyzer type="index"> 
    <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15"/> 
    <filter class="solr.LowerCaseFilterFactory" /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1"  generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll=" 
0" splitOnCaseChange="1" splitOnNumerics="0"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
    <filter class="solr.LowerCaseFilterFactory" /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/> 
    </analyzer> 
</fieldType> 

那麼,有沒有辦法阻止這些字符串的拆分?我會認爲splitOnNumerics =「0」選項會將問題排序(如Solr: Can't search for numbers mixed with characters中所建議的),但似乎無法將其應用於solr.EdgeNGramFilterFactory。我已經使用了這個後一個工廠,因爲它解決了另外一個問題,即在文本字段中搜索「foo bar」時不會找到「foobar.com」(用戶將運行這種搜索並期待一次搜索)。

有沒有人有任何建議來解決這個問題?

回答

0

終於找到了。該edge_ngram字段類型包含在此:

<tokenizer class="solr.WhitespaceTokenizerFactory" />                        
    <filter class="solr.LowerCaseFilterFactory" />                         
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/> 

修改WordDelimiterFilterFactory設置generateNumberParts =「0」的伎倆,同時保留了這一領域的其他要求一樣。