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

发布于 2024-07-19 02:48:14 字数 252 浏览 10 评论 0原文

我正在使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

鹿港巷口少年归 2024-07-26 02:48:14

选项 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

风为裳 2024-07-26 02:48:14

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

Manually add index entries for most common name confusions. Get your customers to type them in on a special form.

慕烟庭风 2024-07-26 02:48:14

您是否尝试过“*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.

月竹挽风 2024-07-26 02:48:14

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

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

对于零个或多个字符,使用 '*',对于零个或一个字符,使用 '?'

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

If you don't care about performance, use WildcardQuery (performance is significantly worse):

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

For zero or more characters, use '*', for zero or one character, use '?'

If performance is important, try using BooleanQuery.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文