1

目标:执行模糊搜索,然后用那些相似的词进行通配符搜索

我现在有一个布尔查询,如下所示:

$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

我不确定模糊搜索是如何提供动力的。有没有办法修改我的查询,以便在模糊搜索返回相似词后可以进行通配符搜索?

4

1 回答 1

2

我怀疑索引时没有分析该字段。

因此,对于第一个查询,您会从通配符查询中获得命中。 *berry*匹配您给出的所有示例。 *bery*但是,它不匹配任何文档,因为它实际上不是任何文档的子字符串。

对于模糊查询,术语通过编辑距离(Damerau-Levenshtein 距离)进行比较。编辑距离为 2 是匹配的默认最大值。

  • beryberry- 编辑距离:1
  • berywild berry- 编辑距离:6
  • berystrawberry- 编辑距离:6
  • beryblueberry- 编辑距离:5

这可以通过使用分析器来部分处理,而不是将整个字符串索引为单个标记。标准分析器将拆分wild berry为标记wildberry,并且您可以期望对此进行模糊匹配。

至于草莓和蓝莓,除非您的分析器以某种方式拆分,否则您straw可以berry通过将 a 合并到分析器中来手动指定要拆分的术语SynonymFilter

另一种选择是在搜索之前尝试更正查询拼写,使用 lucene 的SpellChecker

于 2014-04-20T18:28:51.497 回答