如何找到“FooBar” 当搜索“Foo Bar”时 在 Zend Lucene 中
我正在使用 Zend Lucene 为 php 网站构建搜索功能,但遇到了问题。 我的网站是一个商店总监(类似的东西)。
例如,我有一家名为“FooBar”的商店,但我的访问者搜索“Foo Bar”并得到零结果。 此外,如果商店名为“Foo Bar”并且访问者搜索“FooBar”,则什么也找不到。
我尝试搜索“ foobar~ ”(模糊搜索),但没有找到名为“Foo Bar”的文章
是否有特殊的方法来构建索引或进行查询?
I'm building a search function for a php website using Zend Lucene and i'm having a problem.
My web site is a Shop Director (something like that).
For example i have a shop named "FooBar" but my visitors seach for "Foo Bar" and get zero results. Also if a shop is named "Foo Bar" and visitor seaches "FooBar" nothing is found.
I tried to seach for " foobar~ " (fuzzy seach) but did not found articles named "Foo Bar"
Is there a speciar way to build the index or to make the query?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
选项 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
Option 1: Break the input query string in two parts at various points and search them. eg. In this case query would be (+fo +bar) OR (+foo +bar) OR (+foob +ar) The problem is this tokenization assumes there are two tokens in input query string. Also, you may get extra, possibly irrelevant, results such as results of (+foob +ar)
Option 2: Use n-gram tokenization while indexing and querying. While indexing the tokens for "foo bar" would be fo, oo, ba, ar. While searching with foobar, tokens would be fo, oo, ob, ba, ar. Searching with OR as operator will give you the documents with maximum n-gram matches at the top. This can achieved with NGramTokenizer
手动添加最常见名称混淆的索引条目。 让您的客户在特殊表格中输入它们。
Manually add index entries for most common name confusions. Get your customers to type them in on a special form.
您是否尝试过“*foo* AND *bar*”或“*foo* OR *bar*”? 它在 Ferret 中工作,我读到它是基于 Lucene 的。
Did you tried "*foo* AND *bar*" or "*foo* OR *bar*"? It works in Ferret and I read it is based on Lucene.
如果你不关心性能,请使用 WildcardQuery(性能明显较差):
对于零个或多个字符,使用 '*',对于零个或一个字符,使用 '?'
如果性能很重要,请尝试使用 BooleanQuery。
If you don't care about performance, use WildcardQuery (performance is significantly worse):
For zero or more characters, use '*', for zero or one character, use '?'
If performance is important, try using BooleanQuery.