#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