2013-03-26 2 views
0

Я собираюсь использовать ElasticSearch в качестве поискового репозитория в своем приложении. У меня есть несколько вопросов относительно того, что лучше всего подходит для организации объектов в индексе поиска, когда объекты имеют ассоциации/отношения друг с другом.Как хранить объекты, имеющие отношения в ElasticSearch (поисковая система)

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

Пусть у вас есть эти объекты домена:

Person: - имеет отношение один-ко-многим с Автомобиль

автомобиля: - принадлежит одному Person, много-к-одному с Лицо

Департамент: - Каждый отдела много Людей и каждый Person может принадлежать ко многие отдела, многие-ко-многим

Что бы лучшим способ сохранить это в поисковом индексе ? Каковы варианты? Например, я хочу найти всех людей, принадлежащих к определенному депарату, или всех людей, у которых автомобиль имеет более 300 л.с. Я использую API-интерфейс Java, если это имеет значение.

+0

Я не эксперт (не менее 6 часов опыта с эластичным поиском), поэтому вы можете игнорировать меня. Вы можете взглянуть на использование отношения «родитель», чтобы обеспечить небольшую иерархию, чтобы помочь с некоторой базовой нормализацией. В равной степени, в зависимости от ваших требований, просмотр интерактивных документов в интерактивном режиме может быть вариантом (так как сколько автомобилей будет у одного человека?). Просто идеи, поэтому дайте нам знать, если какая-либо помощь. – Phil

+1

Мне действительно удалось получить эту работу. То, что я сделал, это использовать вложенный тип. Он работает очень хорошо. – LuckyLuke

+0

LuckyLuke один быстрый вопрос о вашем успехе, поэтому я могу узнать немного больше. Вы индексируете отдельные документы или используете API-интерфейс для массового индекса? Моя забота заключается в том, приводит ли вложенные документы в объемный индекс к дублированию документа Person в вашем случае. Если вы индексируете один за другим, тогда не беспокойтесь. – Phil

ответ

1

Эластичный поиск (или Lucene) не является реляционной базой данных, поэтому вам нужно будет flatten ваша модель отношений.

Попробуйте смоделировать вид, что получает эту структуру -

Car|Person|Department 

Это даст вам все атрибуты, необходимые для поиска автомобиля. Это можно импортировать в документ для Car.

Аналогично

Person|Department 

даст вам всю информацию о человеке. Это поможет вам найти Person

Department может быть третьим документом.

У вас может быть несколько документов для каждого объекта. Но отношения должны быть переведены как свойство объекта.

+0

Значит, у автомобиля есть множество людей в строчку? Как это делается, это то, что они называют вложенными документами? Или это не требует специального лечения? – LuckyLuke

+0

Да, у автомобиля будет множество людей. Вы можете определить поле «Лицо» как [ArrayType] (http://www.elasticsearch.org/guide/reference/mapping/array-type.html) в 'Car'. –

Смежные вопросы