Один большой поисковый индекс Elasticsearch или несколько меньших? - PullRequest
2 голосов
/ 25 мая 2019

Я создаю поисковый индекс, который буду использовать исключительно как фильтр терминов .Таким образом, нет поиска / агрегирования, только фильтрация и GET s.

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

Например, скажем, каждый документ относится к пользователю.У каждого пользователя есть список игр, в которые он играл, книги, которые он читал, и фильмы, которые он смотрел.При поиске рекомендаций по игре / книге / фильму я буду использовать термин «фильтр», чтобы отфильтровать те элементы, с которыми они уже взаимодействовали.

Интересно, должен ли я иметь один индекс поиска с документом?отображение как: users_index

{
  'game_ids': [],
  'movie_ids' : [],
  'book_ids': []
}

или один индекс на значение поиска, например: user_games_index

{
  'game_ids': []
}

user_movies_index

{
  'movie_ids': []
}

user_books_index

{
  'book_ids': []
}

Плюсы для одного индекса:

  1. Каждый индекс идет с накладными расходами, поэтому чем меньше, тем лучше
  2. Если я когда-либохотите получить все информации о пользователе, все это в одном индексе

Плюсы для нескольких индексов:

  1. Согласно update api docs , обновление документа означает получение всей информации в первую очередь.Я буду много обновлять каждый документ, и эти массивы могут стать довольно большими (думаю, тысячи идентификаторов).Обновление идентификатора книги приведет к получению всех идентификаторов игры, которые занимают память.Если бы они были в отдельных индексах, я мог бы избежать этого.

  2. Просто было бы легче поддерживать мой конец вещей

Я должен отметить, что еслиЯ использую несколько индексов, это будет только 4 или 5, около 500 тыс. Документов на индекс.Кроме того, только 1 первичный осколок на индекс, без реплик, и я нахожусь на одном экземпляре m5.2xlarge EC2 (8 ядер, 32 ГБ ОЗУ).

Эти характеристики настолько малы, что это не будет иметь большого значенияна данный момент, или я должен отдать предпочтение одному индексу или многим?

1 Ответ

0 голосов
/ 28 мая 2019

Как насчет третьего варианта?

У вас есть один индекс, и каждый ваш документ в индексе выглядит примерно так:

{
    "user_id" : "some_user",
    "document_type" : "movie" or "game" or "book"
    "document_id" : "id of movie, game or book"
}

Почему? Поскольку вы говорите, что игры, фильмы или книги пользователя будут часто обновляться, этот подход позволяет легко добавлять / удалять отдельные фильмы, игры или книги для пользователей.

Вы также можете легко фильтровать книги / фильмы / игры для конкретных пользователей.

Все значения имеют тип "ключевое слово", и фильтрация должна быть быстрой.

PS: «хорошее» сопоставление для индекса ES попытается минимизировать количество обновлений отдельных документов и скорее будет работать на уровне вставки / удаления документов, поскольку ES выполняет эту задачу очень хорошо по сравнению с поиском и обновлением документов.

Редактировать: я добавил примеры запросов, чтобы проиллюстрировать, как можно отфильтровать результаты с помощью запроса bool.

Пример:

  1. Я хочу, чтобы все фильмы / игры / книги, с которыми пользователь X НЕ взаимодействовал.

GET _search

{
  "query": {
    "bool": {
      "must_not":{
        "term" : {
            "user_id" : "user X"
        }
      }
    }
  }
}
  1. Я хочу только фильмы, с которыми пользователь X НЕ взаимодействовал.

GET _search

{
  "query": {
    "bool": {
      "must_not":{
        "term" : {
            "user_id" : "user X"
        }
      },
      "filter":{
        "term" : {
            "document_type" : "movie"
        } 
      }
    }
  }
}
...