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

Поэтому мне нужно искать в базе данных ящиков. Каждая коробка может содержать несколько элементов. Каждый блок имеет общее описание, а каждый элемент имеет описание вместе с некоторыми парами дескриптор / значение (т. Е. Size:large). Я хочу иметь возможность искать в этой базе данных, используя подобный набор информации - я ищу поле, похожее на 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.

Другие вопросы по тегам