0

_timestamp とそれを正しく使用する方法を理解するのに苦労しています。ログデータを保存しているので、タイムスタンプは非常に重要です。タイムスタンプを保存し、範囲でクエリできるようにしたいと思います。_timestamp という名前のフィールドを使用するたびに、クエリを実行しても結果が得られないようです。これは、ISO 8601 テキスト形式を使用して格納およびクエリを実行するか、ミリ秒を long として使用するかに関係なく発生します。誰かがこの作業の完全な例を持っていますか?

テキスト形式を使用する場合のコードをテストします (FWIW、これはローカル ノードとして実行される単体テスト コードです)。

client.admin().indices().create(new CreateIndexRequest(indexName).mapping("log",
            "{\"_timestamp\": {\"enabled\": true, \"store\": \"yes\"}}"));
client.prepareIndex(indexName, "log", auditEvent.getId().toString())
        .setSource(jsonBuilder()
                .startObject().
                field("eventType", auditEvent.getEventType().toString()).
                field("_timestamp", auditEvent.getEventTime().toString(ISODateTimeFormat.dateTime())).
                field("userId", auditEvent.getUserId()).
                endObject())
                .execute()
                .actionGet();

SearchResponse response = client.prepareSearch(indexNames.toArray(new String[] {})).setTypes("log")
            .setQuery(
                    QueryBuilders.
                    boolQuery()
                    .must(QueryBuilders.fieldQuery("eventType", eventType))
                    .must(QueryBuilders.rangeQuery("_timestamp")
                            .from(interval.getStart().toString())
                            .to(interval.getEnd().toString())
                            )
                    )
                    .addField("_timestamp")
                    .execute().actionGet();

すべて一致する同じクエリを実行すると、タイムスタンプ フィールドが表示されます。

"hits" : {
  "total" : 2,
  "max_score" : 1.0,
  "hits" : [ {
    "_index" : "audit-events-2013-03-04",
    "_type" : "log", 
    "_id" : "3d584830-8506-11e2-8365-24be05270b5c",
    "_score" : 1.0,
    "fields" : {
      "_timestamp" : "2013-03-04T20:01:02.003Z"
    }
  }, {
    "_index" : "audit-events-2013-03-04",
    "_type" : "log",
    "_id" : "e6e382e0-84f5-11e2-8365-24be05270b5c",
    "_score" : 1.0,
    "fields" : {
      "_timestamp" : "2013-03-04T18:04:05.006Z"
    }
  } ]

私は何を理解していませんか?

4

1 に答える 1

0

答えは、IndexRequest のタイムスタンプ メソッドを使用して、タイムスタンプを明示的に設定する必要があるということです。_timestamp というフィールドに設定するだけでは機能しません。

IndexRequestBuilder indexRequestBuilder = client.prepareIndex(indexName, "type1", auditEvent.getId().toString())
                .setSource(jsonBuilder()
                        .startObject().
                        field("eventType", auditEvent.getEventType().toString()).
                        auditEvent.getEventTime().toString(ISODateTimeFormat.dateTime())).
                        field("userId", auditEvent.getUserId()).                          endObject()).setTimestamp(Long.toString(auditEvent.getEventTime().getMillis()));
indexRequestBuilder
        .execute()
        .actionGet();
于 2013-03-20T19:39:59.477 に答える