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
、それに対してフィルター処理されたエイリアスを作成したいということです。
編集
私が見つけたいくつかの役立つリンク。これが修正されたバージョンがわからない。 テンプレート内のフィルタリングされたエイリアスは、エイリアス化されたインデックスからマッピングを継承しません #8473 index.query.parse.allow_unmapped_fields 設定は、エイリアス フィルタ内のマップされていないフィールドを許可していないようです #8431
2回目の編集
まったく同じ問題を抱えた 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クライアント
(「観測可能」関連のものは今のところ無視してかまいません)
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();
});
}