Elasticsearch - Моделирование информации каталога видео в одном индексе против нескольких индексов
Мне нужно смоделировать видео каталог, состоящий из фильмов, телешоу, эпизодов, телевизионных каналов и информации о живых программах, в asticsearch. Некоторые из этих объектов взаимосвязаны, некоторые нет. Атрибуты этих сущностей весьма различны, даже если есть некоторые общие.
Теперь, поскольку мне, возможно, потребуется выполнить перекрестную сущность запроса, представьте себе сценарий, когда клиент ищет что-то, что может быть фильмом, телеканалом или программой прямых трансляций, лучше иметь один индекс, содержащий общую сущность, помеченную знаком атрибут логического типа, или лучше иметь несколько индексов, по 1 на каждую сущность (фильм, сериал, канал, программа)? Кроме того, некоторые из этих объектов, например фильмы, могут иметь атрибуты метаданных на нескольких языках.
Исходя из базы данных реляционной модели данных, я бы создал разные индексы, по одному для каждой сущности, и имел бы индекс варианта языка для каждого языка. Любое предложение или лучший подход, чтобы иметь высокую производительность поиска и удобство использования?
1 ответ
Использовать несколько индексов или не очень сильно зависит от приложения, поэтому я не могу дать однозначный ответ, а несколько мыслей.
Исходя из моего опыта, индексы являются скорее средством для поддержки обслуживания и операций, чем для моделирования данных. Например, намного проще удалить индекс, чем удалить все документы из одного источника из большего индекса. Или, если вы поддерживаете совершенно отдельные поисковые приложения, которые не запрашивают данные друг у друга, лучше использовать разные индексы.
Но когда вы хотите, как и вы, запрашивать документы по источникам данных, имеет смысл хранить их в одном индексе. Если только иметь сопоставимый рейтинг по всем элементам в вашем индексе. Убедитесь, что вы повторно используете поля в ваших данных, которые имеют одинаковое значение (название, год производства, исполнители и т. Д.). Для полей, уникальных для источника, мы обычно используем имена полей с префиксом, например movie_...
только для метаданных фильма.
Что касается языка, вам нужно использовать специфичные для языка поля, такие как title_en, title_es, title_de. В идеале во время запроса вы знаете язык вашего пользователя (из браузера, потому что он выбрал его явно, ...), а затем выполняете поиск в доступных для языка полях. Обязательно используйте анализаторы языка для этих полей, при запросе и во время индексации.
Я считаю поисковую систему немного похожей на базу данных: база данных хранит данные, но также может индексировать их. Поисковая система индексирует данные, но также может хранить их. База данных имеет тенденцию нормализовать схему, чтобы удалить избыточность, поисковая система лучше всего работает с денормализованными данными для производительности запросов.