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.