gpt4 book ai didi

java - 如何折叠搜索结果中的重复项

转载 作者:行者123 更新时间:2023-12-04 08:27:46 24 4
gpt4 key购买 nike

我们将 Hibernate Search 6 CR2 与 Elasticsearch 和 Spring Boot 2.4.0 一起使用。有没有办法折叠搜索结果中的重复项?
我们试图像这样“折叠”它们:

    searchResults = searchSession.search(Items.class)
.select(f -> f.field(field.getCode(), String.class))
.where(f -> f.phrase()
.field(field.getCode())
.matching(phrase)
.slop(SLOP))
.fetchHits(20)
.stream()
.distinct()
.collect(Collectors.toList());
...但此方法仅适用于少量结果(小于 fetchHits 大小)并且没有太多相同的点击。当我们在另一个具有数千次点击(约 28M 文档)的索引上尝试这种方法时,我们发现它没有按预期工作,因为 fetchHits 设置——一些应该是的搜索结果——丢失了。当然,这里的主要问题是,通过使用这种方法,我们在搜索时不会区分搜索结果,它发生在原始搜索之后,因此这不是最佳解决方案。
另一个 solution在这里找到,但它有点过时,不是我们问题的实际答案。
在 Hibernate Search 论坛上,我们发现了另一个 solution对于类似的任务,我们尝试实现它并且它起作用了,但作为一个缺点,我们对索引文档字段(现在是 8 个字段而不是 4 个字段)进行了 2 倍乘法。
那么毕竟,是否有可能在没有这些额外字段的帮助的情况下调整 HS 以折叠搜索结果中的重复项?或者,如果没问题……那好吧!我们会记住这一点,并在 future 的情况下用作解决方案。
P.S.:我们实现了search-as-you-type预测服务,所以不需要提取原始实体。

最佳答案

The solution you linked是获取给定字段的匹配文档中所有值列表的最直接方法。这就是聚合的用途。
是的,它需要额外的字段。一般来说,你不能凭空获得性能:要获得更小的执行时间,你需要使用更多的内存。
话虽如此,如果你想要的是建议,你应该看看 Elasticsearch's suggester feature .
Hibernate Search(目前)还没有用于此的 API,因此您必须转换 JSON 以利用此功能。相对容易,你甚至还有an example for your very use case in the reference documentation (看看第二个例子)。
当然,如果你真的想使用短语查询,那会更复杂。我建议你看看 phrase suggester或者 completion suggester .
如果您需要注册一个字段,其类型不受 Hibernate Search 的支持(例如 completion ),也有可能:您只需要一个自定义桥接器。见 this example .

关于java - 如何折叠搜索结果中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65182617/

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