如何在Zend Lucene中找到“Foo Bar”时找到“FooBar”

时间:2009-04-29 07:09:53

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

我正在使用Zend Lucene构建一个php网站的搜索功能,我遇到了问题。 我的网站是商店总监(类似的东西)。

例如,我有一个名为“FooBar”的商店,但我的访客搜索“Foo Bar”并获得零结果。此外,如果一家商店被命名为“Foo Bar”,并且访客搜索“FooBar”,则找不到任何内容。

我试图搜索“foobar~”(模糊搜索),但没有找到名为“Foo Bar”的文章

是否有特定的方法来构建索引或进行查询?

4 个答案:

答案 0 :(得分:2)

选项1:在不同的点将输入查询字符串分成两部分并搜索它们。例如。在这种情况下,查询将是(+ fo + bar)OR(+ foo + bar)OR(+ foob + ar)问题是此标记化假定输入查询字符串中有两个标记。此外,您可能会获得额外的,可能无关的结果,例如(+ foob + ar)

的结果

选项2:在索引和查询时使用n-gram标记化。索引“foo bar”的标记将是fo,oo,ba,ar。在使用foobar搜索时,令牌将是fo,oo,ob,ba,ar。使用OR作为运算符进行搜索将为您提供顶部最大n-gram匹配的文档。这可以通过NGramTokenizer

实现

答案 1 :(得分:1)

手动添加大多数常见名称混淆的索引条目。让您的客户以特殊形式输入。

答案 2 :(得分:0)

您是否尝试过“* foo * AND * bar *”或“* foo * OR * bar *”?它适用于Ferret,我读它是基于Lucene。

答案 3 :(得分:0)

如果您不关心性能,请使用WildcardQuery(性能明显更差):

new WildcardQuery( new Term( "propertyName", "Foo?Bar" ) );

对于零个或多个字符,请使用“*”,对于零个或一个字符,请使用“?”

如果性能很重要,请尝试使用BooleanQuery。