0

我正在使用带有 Groovy 的 Spring Solr。

当我尝试提高结果时遇到问题。

为了解释,考虑一个简化的在线购物域,其中索引实体是产品。

用户有一个shoppingBasket 和一个wishList,每一个都是简单的产品代码列表(即List<String>)。这两个列表首先被处理以确保它们是不同的和唯一的。

一个简单的搜索可能是在产品文本(使用 copyField 制作的复合字段,包含其描述和标题)中的关键字字符串。

要求结果列出关键字在其文本中匹配的每个产品,首先显示购物篮中的任何产品,然后是愿望清单中的任何产品,然后是任何其他产品。

遇到的问题是,虽然进行了一些提升,并从每个分组的 wishList 和 shoppingBasket 中得到结果,但 shoppingBasket 匹配并不总是显示在 wishList 匹配之前。

根据每个列表中的产品,有时会按顺序显示:

所有 wishList 匹配,所有 shoppingBasket 匹配,所有其他匹配

而不是预期的:

所有 shoppingBasket 匹配、所有 wishList 匹配、所有其他匹配

使用以下标准应用提升:

boostingCriteria = new Criteria('productCode_s').in(shoppingBasket).boost(2.0f)
boostingCriteria = boostingCriteria.or(
      new Criteria('productCode_s').in(wishList).boost(1.0f) )

看到这个类似的问题后,我注释掉了一个添加到 PageRequest 中的排序,这没有任何区别。

我还使用@Score 注释将分数包含在返回的结果中。检查这些,我可以看到 solr 对 shoppingBasket 或 wishList 中的所有匹配项给出了相同的分数。这些列表之外的所有匹配都会获得另一个较低的分数(它们之间相同)。

尝试了不同的提升值(分别为 10000.0f 和 5000.0f)无济于事。它确实产生了不同的分数,但在 shoppingBasket 或 wishList 中的所有匹配项之间仍然相同。

即使将搜索简化为仅提升标准,排序仍然存在。

任何想法,将不胜感激。

4

1 回答 1

0

通过反复试验,我发现解决方案是使用 .connect() 方法,如下所示。

boostingShoppingBasket = new Criteria('productCode_s').in(shoppingBasket).boost(10.0f).connect()
boostingWishList = new Criteria('productCode_s').in(wishList).boost(2.0f).connect()

然后将它们组合在一起。

如果还有其他搜索条件也适用(例如,产品描述包含某些文本),则必须在使用连接包装之前将这些条件与提升条件进行“与”运算,这样在更复杂的情况下,我最终会得到以下(假设 createSearchCriteria(searchCommand) 方法返回基本搜索条件):

boostingShoppingBasket = new Criteria('productCode_s').in(shoppingBasket).boost(10.0f)
boostingShoppingBasket = boostingShoppingBasket.and(createSearchCriteria(searchCommand)).connect()

boostingWishList = new Criteria('productCode_s').in(wishList).boost(2.0f)
boostingWishList = boostingWishList.and(createSearchCriteria(searchCommand)).connect()

Criteria criteria = createSearchCriteria(searchCommand)
   .or(boostingShoppingBasket).or(boostingWishList)
于 2016-08-24T16:06:12.473 回答