我在Groovy中使用Spring Solr。
有一个问题,当我试图提高结果。
为了解释,考虑一个简化的在线购物域,其中索引实体是Product。
用户有一个shoppingBasket和一个wishList,它们都是简单的产品代码列表(即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)