0

我在 luke 中运行以下 lucene 查询短语:

+(debtorNumber:10200000 originalDebtorNumber:10200000) +(serviceName:"skype for"^840.0 (serviceName:for* serviceId:for*) (serviceName:skype* serviceId:skype*))

显示在开头的预期结果,例如:

面向经理的 Skype for Business

Microsoft Skype for Business 会议 (Plan2)

Skype for Business 会议的电话拨入

等等。

使用休眠搜索执行的相同查询显示不同的结果:/

例如,我得到以下结果:

为您的 PC、笔记本电脑或服务器提供防病毒保护

瘦客户端的中央管理

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);

请指教。

4

1 回答 1

1

造成这种差异的原因可能有多种,让我试着编制一份清单。

不同的指标

我能想到的主要区别是 Luke 将始终针对单个索引:您明确打开的那个。

Hibernate Search 实际上将在包含MyType和索引子类(以及您可能拥有的任何分片)的所有索引的复合视图上运行查询。通常这只是一个索引,但您可能打开了多个索引?

这会影响结果,当然也会影响分数。

不同的Lucene版本

验证您使用的 Luke 版本是否使用完全相同的 Lucene 版本。

检查得分

您可以使用 Projection 查询让 Infinispan Query / Hibernate Search 解释它产生的所有结果的分数;这对于了解正在发生的事情非常有用。

请参阅Projections部分中的FullTextQuery.EXPLANATIONFullTextQuery.SCORE以及示例 105。

索引阅读器

您还可以使用SearchManager获取低级别IndexReader并直接运行查询,绕过 Infinispan 和 Hibernate Search 代码。

SearchIntegrator si searchManager.unwrap(SearchIntegrator.class);
si.getIndexReaderAccessor(). ...

这可能有助于缩小影响您预期得分的组件的范围。

IndexReaderAccessor可以按类型或名称打开索引。当按名称打开时,它将打开单个索引,当按类型打开时,它将应用规则来满足多态查询并可能返回一个聚合:对它们进行试验以验证它们返回相同的结果可能会很有趣。

...并检查基础知识

确保您打开相同的物理索引:-)

特别是最近版本的 Infinispan 可能会透明地应用分片来改善集群中的数据分布,这在调试评分时可能会令人困惑——尤其是当您没有意识到这一点时。

于 2018-04-17T09:55:01.810 回答