2013-03-27 3 views
13

なぜ、_timestampフィールドが表示されず、そのクエリをフィルタリングできないのですか?elasticsearchでタイムスタンプフィールドを返す

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

{ 
    "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"} 
    }] 
    } 

答えて

15

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

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

この方法であなたはエポックからのミリ秒数のタイムスタンプを取得することができるようになります。その正確な値は、あなたがそれを照会している場合は特に、また、既にRAMに存在する可能性が高い用語、として保存されているので

+0

ありがとうございました。 サイドノートとして、既存のインデックスでマッピングを更新すると、新しいレコードにはタイムスタンプが保存されていて古いものはありませんか?古いレコードも同様に保存されますか? – eran

+10

このマッピングを既存のタイプで更新することはできません。 _timestampマッピングは、型作成時にのみ設定できます。 – imotov

5

タイムスタンプフィールドを格納する必要はありません。あなたはscript_value使用して、その期間を経て、タイムスタンプにアクセスすることができます。

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

結果の値は、UNIXエポックからのミリ秒単位で表されます。 ElasticSearchがあなたのためにこれを行うことはできませんが、ちょっと、完璧なものはありません。

+2

これは働いていた偉大な解決策であるが、唯一のマイナーな変更後:代わりに 'script_values'と1.4.3スクリプトはファイルに住んでなければならないための' script_fields'、[この]に従って(http://www.elasticsearch.org/ guide/en/elasticsearch/reference/current/modules-scripting.html)。 – Juliano

+2

全く動作しません。上述したようにscript_fields' ''にscript_values'を変更しなければならなかった、と '_DOC [ '_タイムスタンプ']' 'に_DOC [ 'タイムスタンプ']'変更しなければなりませんでした。 Onlyは_timestampが格納されている型から正しい値を返し、それ以外の場合は各文書に対して0を返します。 – csauve

関連する問題