java - Lucene 搜索 Luke 与 Hibernate 搜索不同的结果

标签 java lucene hibernate-search infinispan luke

我正在 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.EXPLANATIONFullTextQuery.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/

相关文章:

java - 为 CDI 指定 beans.xml 的自定义路径

spring - 如何在 hibernate 全文搜索中获得总计数?

lucene - 带有 bool 运算符的奇怪 Solr/Lucene 行为

elasticsearch - Elasticsearch查询聚合仅具有特定模式的术语

mysql - EC2 集群中 Infinispan 支持的 Hibernate Search 中出现重复记录错误

hibernate - hibernate 搜索分页奇怪的行为

macos - java 小程序在 JRE 1.6.0_29 及更高版本中未获取焦点 (OS X)

java - 与 Java 的断言不同,Groovy 的断言对于生产代码来说是一个好主意吗?

java - 在 Java XML 属性文件中表达标记 : CDATA vs. 转义标签

java - Apache Lucene - 创建和存储索引?