Spring Solr стимулирует выпуск
Использую Spring Solr с Groovy.
Возникает проблема, когда я пытаюсь повысить результаты.
Для объяснения рассмотрим упрощенный домен онлайн-покупок, где индексируемой сущностью является Product.
У пользователя есть shoppingBasket и wishList, каждый из которых представляет собой простые списки кодов товаров (т.е. List
Простой поиск может быть для ключевого слова String в тексте Продуктов (составное поле, созданное с использованием 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) )
Увидев эту похожую проблему, я закомментировал сортировку, добавляемую в PageRequest, которая не имела никакого значения.
Я также использовал аннотацию @Score, чтобы включить результат в возвращаемые результаты. Изучив их, я вижу, что solr дает одинаковые одинаковые оценки всем совпадениям в shoppingBasket или wishList. Все матчи за пределами этих списков получают еще один более низкий балл (идентичный между ними).
Пробовал разные значения для повышения (10000.0f и 5000.0f соответственно) безрезультатно. Он дал другой результат, но он был одинаковым для всех совпадений в ShoppingBasket или WishList.
Даже упрощая поиск до одних только критериев повышения, порядок все еще отсутствует.
Любые идеи были бы хорошы.
1 ответ
Методом проб и ошибок я обнаружил, что решение было использовать метод.connect() следующим образом.
boostingShoppingBasket = new Criteria('productCode_s').in(shoppingBasket).boost(10.0f).connect()
boostingWishList = new Criteria('productCode_s').in(wishList).boost(2.0f).connect()
Тогда ИЛИ это вместе.
Там, где также были применены другие критерии поиска (например, описание продукта содержало определенный текст), они должны были быть И с критериями повышения, прежде чем переходить на соединение, чтобы в более сложной ситуации я мог бы получить следующее (при условии, что метод 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)