2010-09-15 49 views
1

下面是模式的interresting部分:奇怪的查詢行爲需要一些幫助調試這個

<fieldType name="text_rev" 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="0"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
    <filter class="solr.ASCIIFoldingFilterFactory" /> 
    <filter class="solr.ReversedWildcardFilterFactory" withOriginal="true" maxPosAsterisk="3" maxPosQuestion="2" maxFractionAsterisk="0.33"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      enablePositionIncrements="true" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
    <filter class="solr.ASCIIFoldingFilterFactory" /> 
    </analyzer> 
</fieldType> 

我使用這個字段類型的字段名爲標題,有些產品,其標題包含「哈利·波特」

查詢:「標題:哈利*」將返回0結果,而「標題:哈利」將返回很多。 但標題:Potter *將返回與「標題:Potter」相同數量的結果

那麼爲什麼「標題:Harry *」不返回任何結果呢?

編輯:我發現了一個解決方法使用查詢:「標題:‘哈利·’」 (注意使用「)

下面是查詢標題調試:哈利,標題:哈利*,標題: 「哈利·」

標題:哈利

<str name="rawquerystring">Title:Harry</str> 
    <str name="querystring">Title:Harry</str> 
    <str name="parsedquery">Title:harri</str> 
    <str name="parsedquery_toString">Title:harri</str> 

標題:哈利·

<str name="rawquerystring">Title:Harry*</str> 
    <str name="querystring">Title:Harry*</str> 
    <str name="parsedquery">Title:Harry*</str> 
    <str name="parsedquery_toString">Title:Harry*</str> 

標題: 「哈利·」

<str name="rawquerystring">Title:"Harry*"</str> 
    <str name="querystring">Title:"Harry*"</str> 
    <str name="parsedquery">Title:harri</str> 
    <str name="parsedquery_toString">Title:harri</str> 
+0

我不知道你在說什麼類型的查詢。 XSLT? SQL?還有別的嗎? – Ladlestein 2010-09-15 18:50:12

+0

Solr/Lucene查詢;)檢查問題標記 – 2010-09-15 19:00:51

回答

0

當我們爲 「標題:哈利*」 查詢,它實際上是一個短語搜索默認搜索字段。

這就是它如何處理,並被分配到默認搜索字段,這是我的案例中的文本。 「用戶名:哈里·」 「用戶名:哈里·」 PhraseQuery(狀態文本:「用戶名哈利」) 文字:「用戶名哈利」

「標題:波特*」將返回相同數量的結果爲「標題:Potter「 這聽起來很奇怪,我的猜測將爲0

我建議使用參數debugQuery = on來查看查詢的確切分析方式。 「標題:Harry」正在返回結果,因爲必須有包含該短語的文本。 希望這可以幫助

+0

我在問題中添加了查詢的調試信息。 – 2010-09-16 14:36:12

0

原因是這是LowerCaseFilterFactory和通配符查詢的混合。索引時,這(當然)會降低所有字母 - 讓'哈利'和'哈利'匹配。

當您執行通配符查詢時,如「Harry *」,no analysis is done on the query terms - 即它不是小寫。只要您沒有任何要求區分大小寫的要求,您就可以通過降低查詢客戶端來繞過您的問題。

+0

我試過標題:哈利*它返回了一些結果,但不是我在找什麼。它只返回了標題,如「哈利/尼爾森」或「雷哈豪森設置(5DVD)」的標題,哈利不是一個完整的詞。 – 2010-09-16 14:33:30