Elasticsearchのクエリ検索結果を「_id
でソートする方法」についてまとめました。
環境
Elasticsearch:7.3.2
検索結果のソート
Elasticsearchでは、検索結果をソートした形で受け取ることができます。
例えば、カラムnumber
で昇順ソートしたい場合は以下のようになります。
GET /{index_name}/_search
{
"query": {
"match_all": {}
},
"sort" : [{"number":"asc"}]
}
id
でソートするのにハマった
Elasticsearchでは特に指定がない場合、各ドキュメントへ_id
が自動生成されます。
以下のように_id
でソートしてみた...
GET /{index_name}/_search
{
"query": {
"match_all": {}
},
"sort" : [{"_id":"asc"}]
}
結果、全然うまくソートされていない...
どうやら、自動生成された_id
はstring型らしい。
MySQLのcastみたいな方法はないのか。
全然ドキュメント見つからない。
解決方法
中国語で書かれたサイトで解決策を見つけました。
_id
に基づくソートは以下のように書けるらしい。
GET /{index_name}/_search
{
query: {
match_all: {}
},
sort: {
_script: {
type: 'number',
script: "Integer.parseInt(doc['_id'].value)",
order: 'desc'
}
}
}
この方法は、テキスト数字のソートへ汎用的に使えそうですね!