Можно ли получить оба объекта при выполнении соединения по времени запроса в Lucene - PullRequest
1 голос
/ 01 октября 2019

У меня есть один индекс для продуктов и один индекс для цен.

Предположим, что в документах индекса товаров есть: Id, Name, CategoryId полей, а в индексе цен: Id, ProductId, Amount полей.

Товар может иметь несколько цен. Мне нужно получить продукт со всеми его ценами при поиске в Lucene

Я ищу продукты по CategoryId. Запрос ниже возвращает все цены, но мне также нужен продукт.

var fromField = "Id";
var toField = "ProductId";
var categoryId = 2462;

var fromQuery = new BooleanQuery();
fromQuery.Add(NumericRangeQuery.NewInt32Range("CategoryId", categoryId, categoryId, true, true), Occur.MUST);

var joinQuery = JoinUtil.CreateJoinQuery(fromField, false, toField, fromQuery, _indexProductSearcher, ScoreMode.None);

var topDocs = _indexPriceSearcher.Search(joinQuery, 1800);
foreach (var scoreDoc in topDocs.ScoreDocs)
{
   var foundPrice = _indexPriceSearcher.Doc(scoreDoc.Doc);
}

Я мог бы искать цены, получать все результаты, а для каждого продукта искать цены и строить ответ. Но мне было интересно, есть ли что-то встроенное для этого.

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Мне будет интересно посмотреть, если кто-то придумает что-то встроенное. Я не могу придумать способ достижения вашей цели, кроме как сделать это вручную. Ручной способ: вы можете сделать это в двух запросах: один, который считывает все продукты для категории, и один запрос, который читает все цены на продукты, которые вы только что получили в первом запросе. Затем вы можете сопоставить цены с продуктами, используя эти два списка. Просто мысль. Извините, у меня нет ничего лучше для вас.

0 голосов
/ 11 октября 2019

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

Решение для нас - использовать JoinUtil.CreateJoinQuery. Так что-то вроде этого:

var fromQuery = new BooleanQuery();
fromQuery.Add(NumericRangeQuery.NewInt32Range("CategoryIds", categoryId, categoryId, true, true), Occur.MUST);

var joinQuery = JoinUtil.CreateJoinQuery(fromField, false, toField, fromQuery, _indexProductSearcher, ScoreMode.None);

var topDocs = _indexPriceSearcher.Search(joinQuery, int.MaxValue);

Здесь мы получаем все цены в категории, а затем можем создать Lookup на ProductId и назначить цены для каждого продукта.

...