使用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中的所有匹配之间仍然相同。
即使仅将搜索简化为提升标准,订购仍然有效。
任何想法都会受到赞赏。
答案 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)