2010-07-13 28 views
0

我在Windows上使用Solr 1.4.1(lucene 2.9.3)並試圖理解ShingleFilter。我編寫了下面的代碼,發現如果我提供的字數比字段中索引的實際短語多,那麼對該字段的搜索將失敗,即無法使用debugQuery = true從該字段獲得分數。ShingleFilter使用比索引短語更多的術語搜索失敗

這裏是我創建重現,字段名的例子和索引文件:
ID:1
TITLE_1:妮娜西蒙
TITLE_2:我把一個咒語你

發出以下查詢(dismax):
- 「妮娜西蒙我把」 < - 未能有TITLE_1的搜索得分(使用debugQuery)
- 「妮娜西蒙」 < - 成功

試圖分析上述不一致性時,當我使用Solr的字段分析和'瓦片'字段(下面給出)並嘗試「我將Nina Simone放入」時,它會成功。所以只有在查詢期間不提供分數。我還檢查了'parsedquery',它顯示了向title_1字段發出字符串「Nina_Simone Simone_I_put」的disjunctionMaxQuery。

TITLE_1和TITLE_2字段的類型的「木瓦」,定義爲:

<fieldType name="shingle" class="solr.TextField" positionIncrementGap="100" indexed="true" stored="true"> 
    <analyzer type="index"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.ShingleFilterFactory" maxShingleSize="2" outputUnigrams="false"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.ShingleFilterFactory" maxShingleSize="2" outputUnigrams="false"/> 
    </analyzer> 
</fieldType> 

注意,我也有一個全部接收的字段,它是文本。我有qf設置爲:'id^2 catchall^0.8'並且pf設置爲:'title_1^1.5 title_2^1.2'

有什麼我丟失或做錯了什麼?

回答

0

在dismax查詢中,查詢的分數是子查詢的最大值。不是總和。我真的不知道如何稀疏鵝卵石查詢,但如果它做了像「(title1:(shingle1 shingle2 ...))(title2:(shingle1 shingle2 ...))」,那麼你應該期望看到只有一個領域有助於得分。

+0

是的,如果tie是0.0,那麼dismax會取最大值。您的上述觀點是正確的,但是當您將debugQuery設置爲true時,它應該在選擇最大值之前顯示每個查詢的得分。 請注意,我已經使用PositionFilterFactory(感謝Steve)解決了上述問題,並試圖瞭解它如何修復它。有任何想法嗎? – Ethan 2010-07-19 08:23:11