Elasticsearch にイベント ログ メッセージを保存するための最適化されたアーキテクチャを考え出そうとしています。
ここに私の仕様/ニーズがあります:
- メッセージは読み取り専用です。入力すると、レポートのために照会されるだけです。
- フリーテキスト検索はありません。ユーザーはレポートにフィルターのみを使用します。
timestamp
範囲クエリを実行できる必要があります。- 主に (他のフィールドに加えて)
agent
およびインタラクションでフィルタリングする必要があります。customer
customers
とagents
同じに属していlocation
ます。
したがって、最も頻繁に実行されるクエリは次のようになります: get all LogItem
s given client_id
, customer_id
, and timestamp
range.
はLogItem
次のようになります。
"_source": {
"agent_id" : 14,
"location_id" : 2,
"customer_id" : 5289,
"timestamp" : 1320366520000, //Java Long millis since epoch
"event_type" : 7,
"screen_id" : 12
}
データのインデックス作成についてサポートが必要です。
私はelasticsearchインデックスとは何かを読んできましたか? そしてelasticsearchを使用して顧客にイベントを提供し、優れたインデックス作成アーキテクチャのアイデアを得ることができますが、プロからの支援が必要です.
だからここに私の質問があります:
この記事では、「1 日 1 つのインデックス」を作成することを提案しています。そのアーキテクチャで範囲クエリを実行するにはどうすればよいですか? (例: インデックス範囲でクエリを実行できますか?)
現在、私は 1 つの大きなインデックスを使用しています。location_id ごとに 1 つのインデックスを作成する場合、シャードを使用してレコードをさらに整理するにはどうすればよいですか?
上記の仕様を考慮して、提案できるより良いアーキテクチャはありますか?
どのフィールドでフィルタリングする必要がありますか?
編集:これは私のアプリから実行されたサンプルクエリです:
{
"query" : {
"bool" : {
"must" : [ {
"term" : {
"agent_id" : 6
}
}, {
"range" : {
"timestamp" : {
"from" : 1380610800000,
"to" : 1381301940000,
"include_lower" : true,
"include_upper" : true
}
}
}, {
"terms" : {
"event_type" : [ 4, 7, 11 ]
}
} ]
}
},
"filter" : {
"term" : {
"customer_id" : 56241
}
}
}