Elasticsearch 6.0 Удаление типов сопоставления - Альтернативы - PullRequest
0 голосов
/ 30 декабря 2018

Справочная информация

Я перенес свой индекс ES в версию ES 6. Я на данный момент застрял, потому что ES6 удалил поле использования "_type".

Старая реализация (ES2)

У моего программного обеспечения много пользователей (> 100 КБ).У каждого пользователя есть хотя бы один документ в ES.Итак, иерархия выглядит следующим образом:

INDEX  ->  TYPE      -> Document
myindex->  user-123  -> document-1

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

DELETE /myindex/user-123

(Удалить весь документконкретного пользователя, с помощью одной команды)

Проблема

"_ тип" больше не поддерживается ES6.

Возможное решение

Вместо использования_type, используйте имя индекса как USER-ID.Таким образом, мой индекс будет выглядеть так:

"user-123" -> "static-name" -> document

Удаление пользователя осуществляется путем удаления индекса (вместо удаления type в предыдущей реализации).

Вопросы:

  • Мое первое беспокойство связано с количеством индексов и производительностью: иметь такие показатели, как 1M, приемлемо с точки зрения производительности?не забывайте, что мне приходится часто их искать.
  • У большинства моих пользователей небольшое количество документов хранится в ES.Имеет ли смысл держать осколок, который должен быть дорогим, для <10 документов?</li>
  • Моя архитектура данных звучит для вас разумно?

Любой другой совет будет приветствоваться!Спасибо.

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Наличие этих многочисленных индексов определенно не очень хороший подход.Если вам нужно только удалить несколько документов с помощью одной команды.Затем вы можете использовать Delete by Query API, предоставляемый ElasticSearch

. Вы можете ввести атрибут «subtype» во все ваши документы, содержащие значение для каждого документа, например, значение «user-».Так что в вашем случае документ будет выглядеть так:

{
  "attribute1":"value", 
  "subtype":"user-123"
}
0 голосов
/ 30 декабря 2018

У меня не было бы одного индекса на пользователя, это пустая трата ресурсов, особенно если на пользователя приходится только 10 документов.

Вместо этого я бы использовал отфильтрованные псевдонимы по одному на пользователя.

Таким образом, индекс будет называться users, а тип будет статическим именем, например, doc.Для пользователя 123 все документы этого пользователя будут храниться в users/doc/xyz, и в каждый документ необходимо добавить идентификатор пользователя, например,

PUT users/doc/xyz
{
   ...
   "userId": 123,
   ...
}

Затем вы можете определить отфильтрованный псевдоним для всех документовпользователь 123, как это:

POST /_aliases
{
    "actions" : [
        {
            "add" : {
                 "index" : "users",
                 "alias" : "user-123",
                 "filter" : { "term" : { "userId" : "123" } }
            }
        }
    ]
}

Если вам нужно удалить все документы пользователя 123, то вы можете просто сделать это так:

POST user-123/_delete_by_query?q=*
...