gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:21:42 28 4
gpt4 key购买 nike

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com