谢谢阅读。
我在谷歌上搜索了很多关于同样问题的内容,但都没有找到帮助。经过一番思考,我找到了解决方案。在双引号内搜索字符串,这将解决您的问题。
National Bancorp将返回#1和#2,但是"National Bancorp"只会返回#2。
这是可能需要使用 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 过滤器。
根据我是否正确理解您的问题,您可能需要重新考虑您的要求。如果我误解了您,请耐心等待。
这里有一些值得思考的问题:
如果您只想返回精确匹配,那么为什么还要进行搜索呢?
您确定用户期望精确匹配吗?我通常搜索时假设搜索引擎会适应缺失的单词。
假设用户搜索了国家银行,但是国家银行已不在您的索引中。您是否仍希望将阿比盖尔·亚当斯国家银行股份有限公司从结果中排除,仅因为它不是精确匹配?
基于此,我建议您继续向用户展示所有可能的匹配(精确或不精确),让他们自己决定哪个最适合他们。我之所以这样说,仅因为您可能与所有用户的思维方式不同。Lucene会确保最接近的匹配在结果中排名最高,帮助他们更快地做出选择。
我有相同的精确匹配要求。我使用了org.hibernate.search.query.dsl的queryBuilder,查询如下:
query = queryBuilder.phrase().withSlop(0).onField(field)
.sentence(searchTerm).createQuery();
这对我有效。