Spring Solr助推问题

时间:2016-08-12 09:32:38

标签: java spring groovy solr solr-boost

使用Spring Solr和Groovy。

当我尝试提高效果时出现问题。

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

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

简单搜索可能是针对产品中的关键字字符串' text(使用copyField创建的复合字段,包含其描述和标题)。

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

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

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

所有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) )

看过这个similar issue后,我注释掉了一个被添加到PageRequest的Sort,没有任何区别。

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

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

即使仅将搜索简化为提升标准,订购仍然有效。

任何想法都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

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

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

然后将这些OR组合在一起。

如果还有其他搜索条件也适用(例如产品描述中包含某些文本),则在使用连接进行包装之前,必须使用提升标准对这些条件进行AND运算,这样在更复杂的情况下,我可以使用连接。 d结束以下(假设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)