使用Lucene搜索API查找精确匹配

7
我正在使用Lucene开发公司搜索API。 我的Lucene公司索引中有两家公司: 1. Abigail Adams National Bancorp,Inc. 2. National Bancorp 如果用户输入National Bancorp,则只应返回公司#2(即National Bancorp),而不是#1。也就是说,只有精确匹配的结果才应该被返回。 我如何实现这个功能?
谢谢阅读。

未来的搜索者:如果你只是在搜索一个Lucene索引服务,Somonath Sabat的答案似乎至少在一个实例中是正确的 - 把短语放在双引号中。已经验证过音乐大脑。 - Levin Magruder
5个回答

11
您可以使用KeywordAnalyzer对此字段进行索引和搜索。关键词分析器将为整个字符串生成仅一个标记。

你能否回答这个问题吗? http://stackoverflow.com/questions/899542/problem-using-same-instance-of-indexsearcher-for-multiple-requests - Steve Chapman

2

我在谷歌上搜索了很多关于同样问题的内容,但都没有找到帮助。经过一番思考,我找到了解决方案。在双引号内搜索字符串,这将解决您的问题。

National Bancorp将返回#1和#2,但是"National Bancorp"只会返回#2。


1

这是可能需要使用 shingle 过滤器的情况。该过滤器将多个单词组合在一起。例如,使用 ShingleFilter 生成 3 个标记(假设使用简单的 WhitespaceAnalyzer)的 Abigail Adams National Bancorp 将产生 [Abigail]、[Abigail Adams]、[Abigail Adams National]、[Adams National Bancorp]、[Adams National]、[Adams]、[National]、[National Bancorp] 和 [Bancorp]。

如果用户查询 National Bancorp,则会得到 National Bancorp 本身的精确匹配以及 Abigail Adams National Bancorp 的较低得分的精确匹配(因为该文本字段中有更多的标记,从而降低了 idf)。我认为在这种查询中返回两个文档是有意义的。

根据用例,您可能还想在查询时应用 shingle 过滤器。


0

根据我是否正确理解您的问题,您可能需要重新考虑您的要求。如果我误解了您,请耐心等待。

这里有一些值得思考的问题:

  • 如果您只想返回精确匹配,那么为什么还要进行搜索呢?

  • 您确定用户期望精确匹配吗?我通常搜索时假设搜索引擎会适应缺失的单词。

  • 假设用户搜索了国家银行,但是国家银行已不在您的索引中。您是否仍希望将阿比盖尔·亚当斯国家银行股份有限公司从结果中排除,仅因为它不是精确匹配?

基于此,我建议您继续向用户展示所有可能的匹配(精确或不精确),让他们自己决定哪个最适合他们。我之所以这样说,仅因为您可能与所有用户的思维方式不同。Lucene会确保最接近的匹配在结果中排名最高,帮助他们更快地做出选择。


0

我有相同的精确匹配要求。我使用了org.hibernate.search.query.dsl的queryBuilder,查询如下:

query = queryBuilder.phrase().withSlop(0).onField(field)
                        .sentence(searchTerm).createQuery();

这对我有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接