我正在使用Lucene开发公司搜索API。 我的Lucene公司指数有2家公司: 1.Abigail Adams National Bancorp,Inc。 2.National Bancorp
如果用户输入National Bancorp,则只返回#2公司(即National Bancorp),而不是#1 ..... ie。只返回完全匹配。 我如何实现此功能?
感谢阅读。
答案 0 :(得分:11)
您可以使用KeywordAnalyzer对此字段进行索引和搜索。关键字分析器将仅为整个字符串生成一个标记。
答案 1 :(得分:1)
这可能需要使用木瓦过滤器。此过滤器将多个单词组合在一起例如,带有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过滤器,具体取决于用例。
答案 2 :(得分:1)
我搜索了很多同样问题没有任何帮助。抓了一会儿后,我找到了解决方案。在双引号内搜索字符串,这将解决您的问题。
National Bancorp将返回#1和#2,但“National Bancorp”将仅返回#2。
答案 3 :(得分:0)
您可能需要重新考虑您的要求,具体取决于我是否正确理解您的问题。如果我误解了你,请跟我一起去。
只是一点思考:
如果您只想返回完全匹配,那么您为什么要首先搜索?
您确定用户希望完全匹配吗?我通常会假设搜索引擎会包含缺失的单词。
假设用户搜索了 National Bank ,但 National Bank 已不在您的索引中。您是否仍然希望将 Abigail Adams National Bancorp,Inc 排除在结果之外,因为它不完全匹配?
鉴于此,我建议您继续向用户提供所有可能的匹配(完全或不是),让他们自己决定最适合他们的匹配。我这样说只是因为你可能没有和所有用户一样思考问题。 Lucene将负责确保最接近的匹配在结果中排名最高,帮助他们做出更快的选择。
答案 4 :(得分:0)
我对完全匹配有相同的要求。我使用了org.hibernate.search.query.dsl的queryBuilder,查询为:
query = queryBuilder.phrase().withSlop(0).onField(field)
.sentence(searchTerm).createQuery();
它为我工作。