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

例如,我有一家名为“FooBar”的商店,但我的访问者搜索“Foo Bar”并得到零结果。此外,如果商店名为“Foo Bar”并且访问者搜索“FooBar”,则什么也找不到。

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

有没有特殊的方法来构建索引或进行查询?

有帮助吗?

解决方案

选项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 元语法匹配的文档。这可以通过以下方式实现 NGramTokenizer

其他提示

手动添加最常见名称混淆的索引条目。让您的客户在特殊表格中输入它们。

您是否尝试过“*foo* AND *bar*”或“*foo* OR *bar*”?它在 Ferret 中工作,我读到它是基于 Lucene 的。

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top