我正在使用 Lucene 开发公司搜索 API。我的 Lucene 公司索引有 2 家公司:1.Abigail Adams National Bancorp, Inc. 2.National Bancorp
如果用户键入 National Bancorp,则只应返回公司#2(即 National Bancorp)而不是#1.....即。只应返回完全匹配。如何实现此功能?
谢谢阅读。
我正在使用 Lucene 开发公司搜索 API。我的 Lucene 公司索引有 2 家公司:1.Abigail Adams National Bancorp, Inc. 2.National Bancorp
如果用户键入 National Bancorp,则只应返回公司#2(即 National Bancorp)而不是#1.....即。只应返回完全匹配。如何实现此功能?
谢谢阅读。
您可以使用KeywordAnalyzer对该字段进行索引和搜索。关键字分析器将只为整个字符串生成一个标记。
我用谷歌搜索了很多,但没有解决同样的问题。挠了一阵头后,我找到了解决方案。在双引号内搜索字符串,这将解决您的问题。
National Bancorp 将返回 #1 和 #2,但“National Bancorp”将仅返回 #2。
这可能保证使用带状过滤器。此过滤器将多个单词组合在一起。例如,带有 3 个令牌的 ShingleFilter 的 Abigail Adams National Bancorp 将产生(假设是一个简单的 WhitespaceAnalyzer)[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 过滤器,具体取决于用例。
您可能需要重新考虑您的要求,具体取决于我是否正确理解了您的问题。如果我误解了你,请多多包涵。
只是一点点思考:
如果您只想返回完全匹配,那么您为什么要首先搜索?
您确定用户期望完全匹配吗?我通常搜索假设搜索引擎将容纳丢失的单词。
假设用户搜索National Bank,但National Bank不再在您的索引中。您是否仍然希望Abigail Adams National Bancorp, Inc仅仅因为不完全匹配而被排除在结果之外?
鉴于此,我建议您继续向用户展示所有可能的匹配项(无论是否准确),并让他们自己决定最适合他们的匹配项。我这么说只是因为您可能与所有用户的想法不同。Lucene 将确保最接近的匹配在结果中排名最高,帮助他们更快地做出选择。
我对精确匹配有相同的要求。我使用了 org.hibernate.search.query.dsl 的 queryBuilder,查询是:
query = queryBuilder.phrase().withSlop(0).onField(field)
.sentence(searchTerm).createQuery();
它为我工作。