Script Queryで頑張ろうとするのは少々しんどそうでしたので、代わりの案を紹介したいです。
似たような例がありました。
@spinscale さんがいうには、オブジェクト数ならオブジェクト数を別フィールドに格納しておけば、より速いクエリが使えるし、コストの高いクエリ(=Scriptクエリ)を使う必要はない、と書かれています。
今回の例ですと、このようにアプローチするのはダメでしょうか?
↓ userオブジェクト部分の数え上げと、別フィールドに値を格納するパイプラインを作成
PUT _ingest/pipeline/my_pipeline
{
"description": "count user nested object size",
"processors": [
{
"script": {
"source": """
if (ctx.user != null) {
ctx.user_count = ctx.user.size();
}
"""
}
}
]
}
ドキュメント登録時に、パイプラインを指定して登録する。
PUT my_index/_doc/1?pipeline=my_pipeline
{
"user" : [
{
"first" : "John",
"last" : "Smith"
}
]
}
作成されるIndexで、user_countにuserオブジェクトの数(今回は1)が入る。
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"user_count" : 1,
"user" : [
{
"last" : "Smith",
"first" : "John"
}
]
}
}
このようにしておけば、単純な単一フィールドに対する数値の検索になるため、検索クエリが簡単に作れるかと思います。
Pipelineを使ってuser_count部分を追加しているのは、既存のデータ投入部分に大きな変更を入れなくてもよくて、Pipelineを指定するだけの変更でできそう、ということをお伝えしたかったためです。
ご参考になれば幸いです。