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)
Другие вопросы по тегам