春季Solr提振问题



我在Groovy中使用Spring Solr。

有一个问题,当我试图提高结果。

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

用户有一个shoppingBasket和一个wishList,它们都是简单的产品代码列表(即List)。首先对两个list进行处理,以确保它们是不同且唯一的。

一个简单的搜索可能是查找Products文本中的关键字String(使用copyField创建的复合字段,包含其描述和标题)。

要求结果列出关键字在其文本中匹配的所有产品,首先显示shoppingBasket中的任何产品,然后是wishList中的任何产品,然后是其他任何产品。

遇到的问题是,尽管发生了一些增强,并且wishList和shoppingBasket的结果分别分组,但shoppingBasket匹配并不总是在wishList匹配之前显示。

根据每个List中的产品,它有时以以下顺序显示:

所有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中的Sort,这没有什么区别。

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

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

即使将搜索简化到只考虑提升条件,排序仍然是不存在的。

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

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

Then OR these together.

如果还有其他搜索条件也要应用(例如,产品描述包含某些文本),那么在使用连接包装之前,必须将这些条件与增强条件结合起来,这样在更复杂的情况下,我最终会得到以下内容(假设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)

相关内容

  • 没有找到相关文章

最新更新