目标:执行模糊搜索,然后使用那些类似的术语进行通配符搜索
我现在有一个布尔查询,如下所示:
$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
我不确定模糊搜索是如何供电的。有没有办法修改我的查询,以便我可以在模糊搜索返回类似的术语后进行通配符搜索?
答案 0 :(得分:2)
我怀疑索引时不会分析字段。
因此,使用第一个查询,您将从通配符查询中获得命中。 *berry*
匹配您提供的所有示例。但是,*bery*
与任何文档都不匹配,因为它实际上并不是其中任何文档的子字符串。
对于模糊查询,通过编辑距离(Damerau–Levenshtein distance)比较术语。编辑距离为2是匹配的默认最大值。
bery
至berry
- 编辑距离:1 bery
至wild berry
- 编辑距离:6 bery
至strawberry
- 编辑距离:6 bery
至blueberry
- 编辑距离:5 这可以通过使用分析器来部分处理,而不是将整个字符串索引为单个标记。标准分析器会将wild berry
分割为代币wild
和berry
,您可以期待模糊匹配。
就草莓和蓝莓而言,除非您的分析仪以某种方式分开straw
和berry
,否则您可以通过将SynonymFilter
合并到分析仪中来手动指定要拆分的术语。
另一个选择是尝试使用lucene的SpellChecker