2013-11-26 50 views
3

我想檢查查詢和文檔標題之間的Levenstein距離,然後按照strdist得分過濾結果。solr strdist不返回1.0的分數

的模式是:

<fields> 
    <field name="id" type="string" indexed="true" stored="true" required="true" /> 
    <field name="title" type="text_general" indexed="true" stored="true" required="true" /> 
    <field name="_version_" type="long" indexed="true" stored="true" multiValued="false" /> 
</fields> 

在我的索引我有以下文檔:

{ 
    "id":"1", 
    "title":"iPhone 4S Battery Replacement" 
} 

所以當我發送以下查詢:

http://localhost:8983/solr/collection1/query?q=title:iPhone+4S+Battery+Replacement&fl=*,score,lev_dist:strdist("iPhone+4S+Battery+Replacement",title,edit) 

我得到:

{ 
    "id":"1", 
    "title":"iPhone 4S Battery Replacement", 
    "_version_":1452659974334316549, 
    "score":6.4907703, 
    "lev_dist":0.37931037 
} 

但我期待得到lev_dist = 1.0。爲什麼是0.379? 我在做什麼錯?

回答

2

根據to the docs strdist函數需要兩個字符串來比較它們。它在分析領域的工作方式不同。

計算兩個字符串之間的距離。使用Lucene拼寫檢查器的StringDistance接口並支持該包中的所有可用實現,並允許應用程序通過Solr的資源加載功能插入自己的實現。 strdist需要(字符串1,字符串,距離度量)

試圖圍繞後reading of a grokbase user誰也有類似的問題,你需要添加一個字段就像在你的架構title_raw,見下文,而REINDEX。

<fields> 
    <field name="id" type="string" indexed="true" stored="true" required="true" /> 
    <field name="title" type="text_general" indexed="true" stored="true" required="true" /> 
    <field name="title_raw" type="string" indexed="true" stored="true" /> 
    <field name="_version_" type="long" indexed="true" stored="true" multiValued="false" /> 
</fields> 

那麼你會像查詢

query?q=title:iPhone+4S+Battery+Replacement&fl=*,score,lev_dist:strdist("iPhone 4S Battery Replacement",title_raw,edit) 

正如你所看到的,我從第一個字符串刪除+比較,作爲計算距離時,他們也將被考慮在內。

+0

謝謝!添加了字符串字段並獲得了正確的結果。 – ItayD