2016-09-25 11 views
1

Я сфокусирован на том, что, по-видимому, является фундаментальной проблемой с Elasticsearch и полиморфными данными. Я хотел бы иметь возможность находить несколько типов результатов (например, пользователей, видео и плейлисты) только с одним запросом Elasticsearch. Это должен быть только один запрос, так как таким образом Elasticsearch может делать все скоринг, и мне не придется делать какие-либо магии для объединения нескольких результатов запроса разных типов.Поиск по полиморфным данным с помощью Elasticsearch

Я знаю, что Elasticsearch использует плоскую структуру документа, что приводит к следующей проблеме. Если я индексирую полиморфные данные, мне придется указать «недостающее» значение для каждого уникального атрибута, который мне очень нравится в подсчете подтипов полиморфных данных.

Я искал примеры других решений этой проблемы и не мог найти их. В документации тоже ничего не говорится. Могу ли я игнорировать что-то очевидное или был Elasticsearch просто не предназначен для того, чтобы сделать что-то подобное?

С наилучшими пожеланиями,

Стеффан

ответ

0

То не проблема самого Elasticsearch, его задача (или ограничение) лежащих в основе индексов Lucene. Таким образом, любой db/engine, основанный на lucene, будет иметь те же проблемы (если не хуже :), ES делает чертову работу для вас). Вероятно, ES облегчит боль в дальнейших выпусках, но не резко. И ИМО, вряд ли найдется какая-либо высокотехнологичная поисковая система, которая может иметь истинные полиморфные данные.

Ответ зависит от вашей структуры данных, это точно. В принципе, у вас есть два варианта:

  1. Поместите все свои данные в один индекс и разделите их по типам. И вы уже знаете, что накладные расходы - яркие индексы плохо работают с разреженными данными. Похоже, ваши данные меньше проблем. Во всяком случае, ES выполнит всю базовую работу для «отсутствующих» значений, вам нужно будет справляться с накладными расходами памяти/диска для хранения разреженных данных.

    Если ваши данные организованы с отношением parent-child (т. Е. Видео -> список воспроизведения), вам определенно нужен единый индекс для таких данных. Что оставляет вас только с этим подходом.

  2. Разделите свои данные на несколько индексов. Таким образом, у вас есть несколько более высокие накладные расходы на диск для индекса lucene +, возможно, более высокий уровень использования ЦП при агрегировании данных из нескольких осколков (так что вы должны настроить настройку соответственно).

    Вы по-прежнему можете запросить ES для всех своих документов в одном запросе, поскольку ES поддерживает multi-index запросов.

Итак, это похоже на вопрос исключительно о вашей структуре данных. Я бы рекомендовал просто запустить небольшой кластер для измерения использования памяти/диска/процессора для ожидаемых данных. Подробнее о «index vs shard» - отлично article от Adrien.

Немного не по теме, если ES не соответствует вашим потребностям, я предлагаю вам по-прежнему рассматривать возможность объединения данных со стороны приложения. ES отлично работает с несколькими запросами света (вместо нескольких более тяжелых), и по мере того, как ваши результаты от ES уже отсортированы, вам необходимо объединить отсортированные потоки с отсортированным вводом. Не так много волшебства, тбх.

+0

Проблема с объединением результатов со стороны приложения заключается в том, что подсчет очков не имеет смысла между запросами, поэтому, хотя потоки отсортированы, то, как разные потоки связаны друг с другом, по-прежнему вам нужно определить, что что я имею в виду под магией. В противном случае, большое вам спасибо за ваш ответ! На самом деле я пока не беспокоюсь о накладных расходах, но я помню, как я читал о Lucene и проблемах с разреженными данными. Природа полиморфных данных затрудняет работу любой поисковой системы, хотя я бы ожидал, что где-то будет больше примеров. – steffansluis

+0

Я бы сказал, если только скоринг - единственная проблема - попробуйте многотипный одноиндексный запрос. Если одинаковые поля в ваших данных одинаковы по типу/значению (надеюсь, что, если вам нужно скопировать так :)), просто попробуйте. В случае, если он будет медленным/непригодным для использования, вы можете попробовать использовать MongoDB (true polymorhic, hehe), но только с механизмом хранения wiredtiger (в основном, v3 +). К сожалению, версии, предшествующие 3, не относятся к какой-либо hi-perf-агрегации/аналитике. – Slam