Проблема с усилением Spring Solr

Я использую Spring Solr с Groovy.

Возникла проблема, когда я пытаюсь улучшить результаты.

Для пояснения рассмотрим упрощенный домен интернет-покупок, в котором индексируемым объектом является продукт.

У пользователя есть корзина покупок и список желаний, каждый из которых представляет собой простые списки кодов продуктов (например, List ‹String›). Сначала обрабатываются два списка, чтобы убедиться, что они уникальны и уникальны.

Простой поиск может быть по ключевому слову String в тексте продуктов (составное поле, созданное с использованием copyField, содержащее его описание и заголовок).

Требование состоит в том, чтобы в результатах перечислялся каждый продукт, в тексте которого ключевое слово соответствует любому из тех, которые отображаются в корзине покупок, затем любых продуктов, находящихся в списке желаний, а затем любых других.

Возникшая проблема заключается в том, что, хотя имеет место некоторое повышение и результаты каждого из wishList и shoppingBasket сгруппированы, совпадения shoppingBasket не всегда отображаются перед совпадениями wishList.

В зависимости от продуктов в каждом списке он иногда отображается в следующем порядке:

все совпадения в списке желаний, все совпадения в корзине покупок, все другие совпадения

вместо ожидаемого:

все совпадения в корзине покупок, все совпадения в 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 соответственно), но безрезультатно. Он действительно дал другой счет, но он по-прежнему был одинаковым во всех матчах в корзине покупок или списке желаний.

Даже если упростить поиск до только критериев повышения, упорядочение по-прежнему отсутствует.

Любые идеи были бы хорошы.


person dcode    schedule 12.08.2016    source источник


Ответы (1)


Путем проб и ошибок я нашел решение использовать метод .connect () следующим образом.

boostingShoppingBasket = new Criteria('productCode_s').in(shoppingBasket).boost(10.0f).connect()
boostingWishList = new Criteria('productCode_s').in(wishList).boost(2.0f).connect()

Затем ИЛИ это вместе.

Там, где применялись и другие критерии поиска (например, описание продукта содержало определенный текст), они должны были быть объединены оператором AND с критериями повышения, прежде чем переноситься соединением, так что в более сложной ситуации я бы получил следующее (предполагается, что метод 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)
person dcode    schedule 24.08.2016