我正在 luke 中运行以下 lucene 查询短语:
+(债务人编号:10200000 原始债务人编号:10200000) +(服务名称:"skype
for"^840.0 (服务名称:for* 服务Id:for*) (服务名称:skype*
serviceId:skype*))
在开头显示预期结果:
Skype for Business for Managers
Microsoft Skype for Business Conferencing (Plan2)
Telephone dial-in for Skype for Business Conferencing
等等。
使用 hibernate 搜索执行相同的查询显示不同的结果:/
例如,我得到以下结果:
antivirus protection for your PC, notebook or server
central administration for thin clients
Skype for 出现在第 3 或第 4 页。
java代码是:
SearchManager = Search.getSearchManager(cache)
CacheQuery<MyType> query = searchManager.getQuery(booleanQuery, MyType.class)
List<MyType> pagedResulat = query
.maxResults(criteria.getPageSize())
.firstResult(Math.toIntExact(criteria.getOffset()))
.list()
这会记录我在 Luke 中使用的上述查询
log.info("Lucene Search boolean query:" + booleanQuery);
请指教。
最佳答案
造成差异的原因可能有多种,让我尝试编制一个 list 。
索引不同
我能想到的主要区别是 Luke 将始终针对单个索引:您显式打开的索引。
Hibernate Search 实际上会在包含 MyType 和索引子类(以及您可能拥有的任何分片)的所有索引的复合 View 上运行查询。通常这只是一个索引,但您可能打开了多个索引?
这会影响结果,尤其是分数。
不同的 Lucene 版本
验证您使用的 Luke 版本是否使用完全相同的 Lucene 版本。
查看得分
您可以使用投影查询让 Infinispan 查询/Hibernate 搜索解释其生成的所有结果的分数;这对于了解正在发生的事情非常有用。
请参阅 Projections 部分中的 FullTextQuery.EXPLANATION 和 FullTextQuery.SCORE ,以及示例 105。
索引阅读器
您还可以使用 SearchManager
获取低级 IndexReader
并直接运行查询,绕过 Infinispan 和 Hibernate 搜索代码。
SearchIntegrator si searchManager.unwrap(SearchIntegrator.class);
si.getIndexReaderAccessor(). ...
这可能有助于缩小影响您预期得分的组件的范围。
IndexReaderAccessor
可以按类型或名称打开索引。当按名称打开时,它将打开单个索引,当按类型打开时,它将应用规则来满足多态查询,并可能返回一个聚合:对它们进行实验以验证它们返回相同的结果可能会很有趣。
...并检查基础知识
确保您打开相同的物理索引:-)
特别是最新版本的 Infinispan 可能会透明地应用分片来改善集群中的数据分布,这在调试评分时可能会令人困惑 - 特别是当您不知道的时候。
关于java - Lucene 搜索 Luke 与 Hibernate 搜索不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49872202/