【问题标题】:Zend Lucene - Wildcard search based off of Fuzzy searchZend Lucene - 基于模糊搜索的通配符搜索
【发布时间】:2014-04-20 17:42:57
【问题描述】:

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

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

$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

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

【问题讨论】:

    标签: php zend-framework search lucene zend-lucene


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 很好的答案。我会调查这些。谢谢。
    猜你喜欢
    • 2014-06-11
    • 2011-12-09
    • 2014-05-04
    • 1970-01-01
    • 2018-04-20
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多