2016-08-12 3 views
0

Использование пружины Solr с Groovy.Spring Solr boosting issue

Имейте проблему, когда я пытаюсь повысить результаты.

Чтобы объяснить, рассмотрите упрощенную область покупок в Интернете, где индексированным объектом является Продукт.

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

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

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

Проблема связана с тем, что, хотя происходит некоторое повышение, и результаты из списка желаний и 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, чтобы включить оценку в возвращаемые результаты. Осмотрев их, я вижу, что solr дает одинаковый результат для всех матчей либо в shoppingBasket, либо в WishList. Все совпадения за пределами этих списков получают еще один более низкий балл (идентичный между ними).

Пробовали разные значения для повышения (10000.0f и 5000.0f соответственно) безрезультатно. Он сделал другой счет, но он все равно был идентичным между всеми матчами либо в shoppingBasket, либо в WishList.

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

Любые идеи будут оценены.

ответ

0

Через пробную версию и ошибку я нашел решение использовать метод .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)