2015-06-10 70 views
0

我正在使用django 1.5以及haystack 2.1.0。Django-Haystack autoquery給solr後端帶來奇怪的結果

在其中一個模型上使用自動查詢時,我發現了以下行爲。

test_search = "charles ken" 

SearchQuerySet().models(Foo, FooSome, FooGone).auto_query(test_search) 

以上查詢給出了多個結果。

test_search = "charles k" 

SearchQuerySet().models(Foo, FooSome, FooGone).auto_query(test_search) 

上面的查詢沒有給出結果。我究竟做錯了什麼 ?

編輯:

的關注領域是edge_ngram

<fieldType name="edge_ngram" class="solr.TextField" positionIncrementGap="1"> 
     <analyzer type="index"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/> 
     <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> 
+0

這是否涉及schema.xml?如果是,那麼您正在搜索的字段使用的字段類型是什麼? –

+0

@AbhijitBashetti我已經編輯了這個問題來包含字段類型。 –

+0

好的。哪個使用什麼?這意味着哪個字段使用什麼類型?如果你分享fieldType細節,這將是一件好事嗎?像什麼分析儀,記號器和過濾器組成? –

回答

1

這裏需要改變minGramSize 1

<fieldType name="edge_ngram" class="solr.TextField" positionIncrementGap="1"> 
     <analyzer type="index"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/> 
     <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" 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> 

但我會建議有minGramSize = 2或3因爲它會避免許多索引。

+0

如果我在查詢端添加了一個過濾器怎麼辦? EdgeNgramFilter?我試過了。它適用於所關注的情況。唯一的缺點是我可以看到,對於每個查詢,它都會將其分解成若干部分,然後搜索它。 –

+0

你可以添加,但我不認爲它真的需要在查詢結束。因爲它會給你更多你可能沒有想到的結果。對於每一個查詢都會破壞單詞的缺點是正確的,正如我所說的,會得到更多與您無關的響應。 –