我正在使用Zend Lucene构建一个php网站的搜索功能,我遇到了问题。 我的网站是商店总监(类似的东西)。
例如,我有一个名为“FooBar”的商店,但我的访客搜索“Foo Bar”并获得零结果。此外,如果一家商店被命名为“Foo Bar”,并且访客搜索“FooBar”,则找不到任何内容。
我试图搜索“foobar~”(模糊搜索),但没有找到名为“Foo Bar”的文章
是否有特定的方法来构建索引或进行查询?
答案 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。