9

マッピングを使用してすべてのフィールドを設定できないエラスティック検索インデックスがあるため、日付は文字列として入力されます...

その文字列の日付でソートする方法を知っている人はいますか?

私は_scriptを見てきました

{
    "query" : {
        ....
    },
    "sort" : {
        "_script" : {
            "script" : "doc['field_name'].value",
            "type" : "string",
            "order" : "asc"
        }
    }
}

しかし、これは分析されたフィールドであるため失敗します...

どんな提案も素晴らしいでしょう!

ありがとう

4

2 に答える 2

15

日付の形式がわかっている場合は、その形式を dynamic_date_formats (このリンクをチェックしてください) 設定に追加できます。新しい文字列フィールドにインデックスを付けると、通常の方法でソートできる日付型に変換されます。

例:

プロパティなしでインデックスを作成します。

curl -XPUT http://localhost:9200/dates -d '
{
    "dates" : {
        "dynamic_date_formats" : ["yyyy-MM-dd", "dd-MM-yyyy"],
        "properties" : {
        }
    }
}'

インデックス 2 ドキュメント:

curl -XPUT 'http://localhost:9200/dates/dates/1' -d '
{
    "arbitraryDate": "2013-01-01"
}'

curl -XPUT 'http://localhost:9200/dates/dates/2' -d '
{
    "arbitraryDate": "2012-01-01"
}'

マッピングを確認すると、フィールドが文字列ではないことがわかります。

curl -XGET 'http://localhost:9200/dates/_mapping'

結果:

{
  "dates": {
    "dates": {
      "properties": {
        "arbitraryDate": {
          "type": "date",
          "format": "dateOptionalTime"
        }
      }
    }
  }
}

簡単にソートできるようになりました。

curl -XGET 'http://localhost:9200/dates/_search' -d '
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "arbitraryDate": {
        "order": "asc"
      }
    }
  ]
}'
于 2013-08-23T15:46:03.523 に答える