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

dojqjjoe  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(381)

我们使用HibernateSearch6CR2和elasticsearch以及SpringBoot2.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大小)以及没有太多相同的命中。当我们在另一个有数千次点击(约2800万个文档)的索引上尝试此方法时,我们发现它并没有按预期工作,因为fetchhits设置(一些应该是的搜索结果)丢失了。当然,这里的主要问题是,使用这种方法,我们在搜索时不会区分搜索结果,它发生在原始搜索之后,因此不是最佳解决方案。
在这里找到了另一个解决方案,但它有点过时,不是我们问题的实际答案。
在hibernate搜索论坛上,我们为类似的任务找到了另一个解决方案,我们尝试实现了它,它也起了作用,但是作为一个缺点,我们得到了索引文档字段的2倍乘法(现在是8个字段,而不是4个字段)。
那么,到底有没有可能在没有这些额外字段的帮助下调整hs以折叠搜索结果中的重复项呢?或者,如果可以的话。。。那好吧!我们将记住这一点,并在以后的案例中用作解决方案。
p、 答:我们实现了按类型搜索预测服务,因此不需要提取原始实体。

5rgfhyps

5rgfhyps1#

链接的解决方案是获取给定字段的匹配文档中所有值的列表的最直接的方法。这就是聚合的用途。
是的,它需要额外的字段。一般来说,您不能凭空获得性能:要获得较小的执行时间,您需要使用更多内存。
也就是说,如果你想要的是建议,你应该看看elasticsearch的suggester特性。
hibernate搜索中还没有这个api,因此您必须转换json才能利用这个特性。这相对简单,您甚至在参考文档中为您的用例提供了一个示例(请看第二个示例)。
当然,如果你真的想使用短语查询,它会更复杂。我建议你看一下短语suggester,或者可能是完成suggester。
如果您需要注册一个hibernate搜索不支持开箱即用的类型的字段(例如。 completion ),这也是可能的:你只需要一个自定义桥。看这个例子。

相关问题