我在Groovy中使用Spring Solr。
当我试图提高结果时,我有一个问题。
为了解释,考虑一个简化的在线购物域,其中索引的实体是Product。
用户有一个shoppingBasket和一个wishList,每一个都是产品代码的简单列表(即列表)。首先对两个列表进行处理,以确保它们是不同的和唯一的。
一个简单的搜索可能是在产品文本(使用copyField生成的复合字段,包含其描述和标题)中的关键字字符串。
要求结果列出每个产品,其中关键字在其文本中与shoppingBasket中的任何关键字匹配,首先显示,然后列出wishList中的任何关键字,最后列出任何其他关键字。
所遇到的问题是,尽管正在进行一些提升并且来自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) )看过这个similar issue之后,我注释掉了添加到PageRequest中的一种类型,这没有什么不同。
我还使用了@Score注释将分数包含在返回的结果中。检查这些,我可以看到,无论是shoppingBasket还是wishList中的所有匹配,solr都会给出相同的分数。这些列表之外的所有匹配都会得到另一个较低的分数(它们之间相同)。
我已经尝试了不同的boosts值(分别为10000.0f和5000.0f ),但都没有效果。它确实产生了不同的分数,但在shoppingBasket或wishList的所有比赛中,它仍然是相同的。
即使将搜索简化到仅仅是提升标准,排序仍然是不正确的。
任何想法都将不胜感激。
发布于 2016-08-25 00:06:12
通过反复试验,我发现解决方案是使用.connect()方法,如下所示。
boostingShoppingBasket = new Criteria('productCode_s').in(shoppingBasket).boost(10.0f).connect()
boostingWishList = new Criteria('productCode_s').in(wishList).boost(2.0f).connect()然后或者把这些放在一起。
如果还需要应用其他搜索条件(例如,产品描述包含某些文本),则在使用connect进行包装之前,必须使用boosting条件进行ANDed,这样在更复杂的情况下,我将以以下方式结束(假设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)https://stackoverflow.com/questions/38914624
复制相似问题