在 Zend Lucene 中搜索“Foo Bar”时如何找到“FooBar”
-
03-07-2019 - |
题
我正在使用 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。
不隶属于 StackOverflow