13

クエリをフィルタリングできるのに_timestampフィールドが表示されないのはなぜですか?

次のクエリは正しいドキュメントを返しますが、タイムスタンプ自体は返しません。タイムスタンプを返すにはどうすればよいですか?

{
  "fields": [
    "_timestamp",
    "_source"
  ],
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "range": {
          "_timestamp": {
            "from": "2013-01-01"
          }
        }
      }
    }
  }
}

マッピングは次のとおりです。

{
    "my_doctype": {
        "_timestamp": {
            "enabled": "true"
        },
        "properties": {
            "cards": {
                "type": "integer"
            }
        }
    }
}

サンプル出力:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "test1",
      "_type" : "doctype1",
      "_id" : "HjfryYQEQL6RkEX3VOiBHQ",
      "_score" : 1.0, "_source" : {"cards": "5"}
    }, {
      "_index" : "test1",
      "_type" : "doctype1",
      "_id" : "sDyHcT1BTMatjmUS0NSoEg",
      "_score" : 1.0, "_source" : {"cards": "2"}
    }]
  }
4

2 に答える 2

15

タイムスタンプフィールドが有効になっている場合、インデックスが作成されますが、デフォルトでは保存されません。したがって、タイムスタンプフィールドで検索およびフィルタリングすることはできますが、レコードを使用して簡単に取得することはできません。タイムスタンプフィールドを取得できるようにするには、次のマッピングを使用してインデックスを再作成する必要があります。

{
    "my_doctype": {
        "_timestamp": {
            "enabled": "true",
            "store": "yes"
        },
        "properties": {
            ...
        }
    }
}

このようにして、エポックからのミリ秒数としてタイムスタンプを取得できます。

于 2013-03-27T10:19:53.867 に答える
6

タイムスタンプフィールドは正確な値が用語として保存されるため、保存する必要はありません。これは、特にクエリを実行している場合は、RAMにすでに存在している可能性が高くなります。script_value:を使用して、その用語を介してタイムスタンプにアクセスできます。

{
    "query": {
        ...
    },
    "script_fields": {
        "timestamp": {
            "script": "_doc['_timestamp'].value"
        }
    }
}

結果の値は、UNIXエポック以降のミリ秒で表されます。ElasticSearchがこれを実行できないのは非常に卑劣ですが、完璧なものはありません。

于 2014-11-18T02:13:50.330 に答える