Elastic Search отфильтрованные псевдонимы с несопоставленными полями

Я недавно начал играть с filtered aliases в Elastic Search (документация здесь), но есть вариант использования, который я не уверен, как подойти.

Случай использования

Каждый документ, который я индексирую в ElasticSearch для факта, будет иметь поле с именем "tenantId" (а также некоторые другие поля, такие как "type", "id" и т. Д.). Теперь все документы находятся в одном индексе, поэтому для каждого арендатора я хочу убедиться, что я создал отфильтрованный псевдоним. Теперь я хочу создать отфильтрованный псевдоним, как только я создаю самого арендатора, и у меня есть "tenantId".

проблема

Когда я попытался создать псевдоним программно, используя его Java-клиент, я получил следующее исключение:

Caused by: org.elasticsearch.index.query.QueryParsingException: 
     [mdm-master] Strict field resolution and no field mapping 
     can be found for the field with name [tenantId] 

Исследуя больше, я обнаружил, что, вероятно, я могу использовать динамические шаблоны для достижения этой цели. Поэтому я создал шаблон, сохранил его под config/templates, пересоздал мой индекс и попробовал то же самое снова. Получил то же исключение снова. Читая документацию здесь (нижние 3 строки на странице), я обнаружил, что даже если я попытаюсь изменить следующее свойство index.query.parse.allow_unmapped_fields в true (что я еще не пробовал), для отфильтрованных псевдонимов это приведет к ложному.

Теперь вопрос в том, как мне подойти к моему варианту использования? Я не знаю отображений соответствующих типов, но я точно знаю, что каждый документ, который я индексирую, независимо от типа, ВСЕГДА будет иметь поле с именем tenantId и это то, что я хочу создать свой отфильтрованный псевдоним.

РЕДАКТИРОВАТЬ

Пару полезных ссылок, которые я нашел. Не уверен, на какой версии это исправлено. отфильтрованные псевдонимы в шаблонах не наследуют сопоставления из псевдонима index # 8473 Параметр index.query.parse.allow_unmapped_fields, по-видимому, не позволяет отображать не отображенные поля в фильтрах псевдонимов #8431

ВТОРОЕ РЕДАКТИРОВАНИЕ

Нашел открытую ошибку для ElasticSearch с точно такой же проблемой. Ожидание ответа от разработчиков ES. Не удалось создать фильтрованный псевдоним для пустого индекса с сопоставлениями шаблонов #10038

Вся помощь очень ценится! Я пытался выяснить это из пары дней безуспешно:(.

Ниже приведен код, который я использовал для добавления отфильтрованного псевдонима, и шаблон json отображения по умолчанию

шаблон

{
  "template-1": {
    "template": "*",
    "mappings": {
      "_default_": {
        "properties": {
          "type": {
            "type": "string",
            "index": "not_analyzed"
          },
          "id": {
            "type": "string",
            "index": "not_analyzed"
          },
          "tenantId": {
            "type": "string",
            "index": "not_analyzed"
          }
        }
      }
    }
  }
}

JAVA CLIENT

(Вы можете игнорировать связанные с "Observable" вещи на данный момент)

public Observable<Boolean> createAlias(String tenantId) {

        FilterBuilder filter = FilterBuilders.termFilter("tenantId", tenantId);
        ListenableActionFuture<IndicesAliasesResponse> response = client.admin().indices().prepareAliases().addAlias("mdm-master", tenantId, filter).execute();
        return Observable.from(response)
                .map((IndicesAliasesResponse apiResponse) -> {
                    return apiResponse.isAcknowledged();
                });
    }

1 ответ

Я парень, который опубликовал последний выпуск ES Github. Не удалось создать отфильтрованный псевдоним в пустом индексе с шаблонными сопоставлениями # 10038. Самый быстрый обходной путь, который я нашел на данный момент (кроме понижения до версии 1.3, где эта проблема не существует), заключается в индексации документа с полем перед созданием псевдонима.

Если у вас есть один индекс со многими арендаторами, вам нужно будет только один раз индексировать документ с обязательным полем при создании индекса, и тогда вы сможете создать псевдоним.

Если вы попробуете случай воспроизведения, который я опубликовал в выпуске GitHub, но перед созданием псевдонима выполните следующее:

curl -XPOST  'http://localhost:9200/repro/dummytype/1' -d '{
   "testfield": "dummyvalue"
}'

Тогда вы сможете добавить отфильтрованный псевдоним на поле testfield,

Изменить - Ответ на первый комментарий: я думаю, что это недосмотр, когда вы используете отображение в шаблонах. Шаблон применяется к соответствующему индексу при его создании. Я думаю, что проблема здесь в том, что общая часть отображения шаблона фактически не применяется, пока не будет проиндексирован документ. Такое поведение можно наблюдать, если вы измените мой шаблон в проблеме на следующее:

curl -XPUT 'http://localhost:9200/_template/repro' -d '{
  "template": "repro",
  "settings": {
    "index.number_of_shards": 1,
    "index.number_of_replicas": 0
  },
  "mappings": {
    "dummytype": {
      "properties": {
        "testfield": {
          "type": "string",
          "index": "not_analyzed"
        }
      }
    }
  }
}'

Затем вы сможете создать индекс и добавить отфильтрованный псевдоним без индексации каких-либо документов.

Как я уже сказал, я думаю, что это ошибка в шаблоне приложения в ES.

Другие вопросы по тегам