2012-12-31 113 views
0

隨着Lucene 4的Levenshtein實現自稱比以前快了100倍(http://blog.mikemccandless.com/2011/03/lucenes-fuzzyquery-is-100-times-faster.html),我想對查詢中的所有詞語進行模糊匹配。這個想法是,搜索'gren軟管'應該能夠找到'綠屋'文檔(我並不在乎這裏的短語,這些引用只是爲了使其更具可讀性)。Solr中每個查詢詞的模糊匹配

我使用Lucene 4 + 4 Solr的,因爲我做了一些預處理和後處理周圍有Solr的小包裝的servlet,該servlet使用SolrJ最終訪問Solr的

我目前在實現這一目標的正確途徑上有點失落。我的基本方法是將搜索查詢分解爲術語並在每個術語中附加代字符/模糊運算符。因此'gren軟管'會變成'gren〜hose〜'。現在的問題是如何正確地做到這一點。我可以看到幾種方法:

  1. 蠻力:假設條件由空格分隔,所以只需分析查詢和每個空格之前追加一個波浪線(即每學期後。)
  2. 兩個步驟:發送打開查詢調試的Solr查詢。這會給我一個由Solr解析的查詢術語列表。然後,我可以從調試輸出中提取術語,附加波形符號運算符,並使用附加的波形符運算符重新運行查詢。
  3. 內部:掛鉤到搜索請求處理程序中,並在查詢被解析爲術語後附加波形符號運算符

方法1很臭,因爲它會完全繞過Solr的查詢解析,所以我寧願不這樣做。如果解析查詢兩次的代價不太高,方法2聽起來非常可行。方法3聽起來恰到好處,但我還沒有弄清楚我必須在哪裏加入處理鏈。

也許有一種完全不同的方式來實現我想要做的,或者這可能只是我的一個愚蠢的想法。無論如何,我會非常欣賞一些指針,也許別人已經做了這樣的事情。謝謝!

回答

1

我建議以下方法:

  1. 實現應用程序中的查詢處理模塊,在這裏你可以建立從輸入用戶查詢的Solr查詢。這樣,SOLR方面沒有任何變化,並且您的應用程序對進入SOLR的內容擁有全部控制權。

  2. 實現您自己的查詢解析器,您可以從標準SOLR查詢解析器(org.apache.solr.search.QParser)開始並進行更改。你的應用程序只需要選擇你的自定義查詢解析器,並保留你的實現應該保重。

我寧願方法1,因爲這使得整個系統完全不可知的SOLR升級,Solr的任何新版本將不會要求我更新自定義qparser,你會不會有更新/構建和設置您的自定義qparser在新版本中。

如果你沒有對應用程序進行任何控制,也不想通過qparser路徑,那麼你可以實現一個Servlet過濾器,它在調度到solr請求過濾器之前轉換solr查詢。