Zend Lucene - 基于模糊搜索的通配符搜索

时间:2014-04-20 17:42:57

标签: php zend-framework search lucene 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

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

1 个答案:

答案 0 :(得分:2)

我怀疑索引时不会分析字段。

因此,使用第一个查询,您将从通配符查询中获得命中。 *berry*匹配您提供的所有示例。但是,*bery*与任何文档都不匹配,因为它实际上并不是其中任何文档的子字符串。

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

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

这可以通过使用分析器来部分处理,而不是将整个字符串索引为单个标记。标准分析器会将wild berry分割为代币wildberry,您可以期待模糊匹配。

就草莓和蓝莓而言,除非您的分析仪以某种方式分开strawberry,否则您可以通过将SynonymFilter合并到分析仪中来手动指定要拆分的术语。

另一个选择是尝试使用lucene的SpellChecker

在搜索之前纠正查询拼写