2014-04-20 42 views
1

目標通配符搜索:執行模糊搜索,然後用這些類似的術語Zend的Lucene的 - 基於關閉模糊搜索

我在此刻地方布爾查詢通配符搜索,如下圖所示:

$query = new Zend_Search_Lucene_Search_Query_Boolean(); 

$pattern = new Zend_Search_Lucene_Index_Term("*$string*"); 
$subquery1 = new Zend_Search_Lucene_Search_Query_Wildcard($pattern); 

$term = new Zend_Search_Lucene_Index_Term("$string"); 
$subquery2 = new Zend_Search_Lucene_Search_Query_Fuzzy($term); 

$query->addSubquery($subquery1, null /* optional */); 
$query->addSubquery($subquery2, null /* optional */); 

$hits = $index->find($query); 

這似乎正在執行一個/或搜索。例如:如果我搜索的詞

"berry" 

我在標題擊中「漿果」一切隨時隨地

berry, wild berry, strawberry, blueberry 

但是如果我搜索

"bery" 

我只打了結果像

berry 

我是不完全確定模糊搜索是如何供電的。有沒有辦法修改我的查詢,以便在模糊搜索返回類似條件後可以通配符搜索?

回答

2

我懷疑這個字段在索引時沒有被分析。

因此,使用第一個查詢,您將從通配符查詢中獲得匹配。 *berry*符合您提供的所有示例。但是,*bery*與任何文檔都不匹配,因爲它實際上並不是它們中的任何一個的子字符串。

對於模糊查詢,通過編輯距離比較術語(Damerau–Levenshtein distance)。編輯距離爲2是匹配的默認最大值。

  • beryberry - 編輯距離:1
  • berywild berry - 編輯距離:6
  • berystrawberry - 編輯距離:6
  • beryblueberry - 編輯距離:5

這可以部分通過使用分析器來處理,而不是將整個字符串索引爲單個標記。標準分析儀會將wild berry分成標記wildberry,並且您可能會期望模糊匹配。

至於草莓和藍莓,除非你的分析器分裂開來strawberry不知何故,你可以手動指定條款通過將SynonymFilter到您的分析儀裂開。

另一種辦法是嘗試搜索,使用Lucene的SpellChecker

+0

大答案之前糾正拼寫查詢。我會研究這些。謝謝。 –