Nested datatypeの要素から値の存在判定をしたい


(Skane) #1

初めまして、Nested datatypeの要素から条件に合致したドキュメントを引っ張ってくるクエリ方法で困ったことがございます。
下記のようにnestedを利用したmappingを登録したとします。

"mappings": {
"topics" : {
"properties" : {
"item_id" : {
"type" : "keyword"
},
"publish" : {
"type" : "nested",
"properties" : {
"id" : {
"type" : "integer"
},
....
}
},
....
}
}
}

これに対して、

{
"item_id" : 1,
"publish" : [
{"id" : 1, ...},
{"id" : 2, ...}
]
}

{
"item_id" : 2,
"publish" : [
{"id" : 1, ...}
]
}

を2件ドキュメントを登録したとします。
この2件に対して、publish.id = 2が 存在しないドキュメントを検索するクエリはありますでしょうか?
クエリ結果の期待値としては、

{
"item_id" : 1,
"publish" : [
{"id" : 1, ...},
{"id" : 2, ...}
]
}

のみ結果として取得できたらと思っております。


(tsgkdt) #2

期待値に「publish.id=2」は含まれているように見えますが、

{
  "item_id" : 1,
  "publish" : [
     {"id" : 1, ...},
     {"id" : 2, ...}  ← ここ
  ]
}

この2件に対して、publish.id = 2が 存在しないドキュメントを検索するクエリはありますでしょうか?

publish.id=2(ネストされたオブジェクトで特定の値)を含むものだけを検索したい、ということなのでしょうか?
あるいは、「publish.id=2が存在しない」ということ期待されているのであれば、検索結果としての
期待値としては、item_idは2になるのでは? という確認です。


(Skane) #3

大変失礼いたしました。
期待値に誤りがございました。
publish.id = 2が存在しない場合なので、期待値は下記となります。

{
"item_id" : 2,
"publish" : [
{"id" : 1, ...}
]
}


(Jun Ohtani) #4

publish.id = 2のクエリをboolのmust_notに入れれば良いかと。


(tsgkdt) #5

johaniさんが書いている内容で、期待する結果が取れることを確認できました。

{
  "query": {
    "bool": {
      "must_not": [
        {
          "nested": {
            "path": "publish",
            "query": {
              "match": {
                "publish.id": 2
              }
            }
          }
        }
      ]
    }
  }
}

※ mappingについては、提示されたものを利用


(Skane) #6

頂いたクエリをこちらでも試し、解決しました。
ありがとうございました!


(system) #7

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.