Сложная индексация данных с помощью Lucene?

#search #lucene #full-text-search #search-engine

#Поиск #lucene #полнотекстовый поиск #поисковая система

Вопрос:

Итак, мне нужно выполнить поиск в базе данных ящиков. Каждый блок может содержать несколько элементов. Каждый блок имеет общее описание, и у каждого элемента есть описание вместе с некоторыми парами дескриптор / значение (т. Е. Размер: большой). Я хочу иметь возможность выполнять поиск в этой базе данных, используя аналогичный набор информации — я ищу поле типа x, содержащее элементы a, b и c. Верните поле, содержащее наиболее похожие элементы.

Однако я не понимаю, как мне следует индексировать эти данные в Lucene. Я знаю, что могу проиндексировать несколько значений в одном поле, переопределив метод getPositionIncrement() анализатора, но как мне связать дескрипторы с конкретным элементом? Например, у меня может быть 2 элемента в моем ящике:

 Item 1
description: pair of shoes
color: blue

Item 2
description: Jacket
color: red
  

и я ищу

 Item A
description: pair of shoes
color: red

Item B
description: Jacket
color: blue
  

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

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

Ответ №1:

В этом случае вам необходимо сохранить связь между родительским документом (блоком) и дочерними документами (элементами). К счастью, для таких целей существует BlockJoinQuery. В этой статье это подробно описано для Lucene 3.x или вы можете использовать ToParentBlockJoinQuery, который доступен для Lucene 4.x