0

次のようなデータを含むドキュメントがたくさんあります。

   "paymentMethods": [
         {
            "id": 194,
            "name": "Wire",
            "logo": "wire.gif"
        }, {
            "id": 399,
            "name": "Paper Check",
            "logo": "papercheck.gif"
        }

マッピング:

 "paymentMethods": {
    "type": "nested",
    "properties": {
        "id": {
            "type": "long"
        },
        "logo": {
            "type": "string",
            "index": "not_analyzed"
        },
        "name": {
            "type": "string",
            "index": "not_analyzed"
        }
    }
 }

paymentMethos.id 399 & 194 を持つすべてのドキュメントを取得しようとしました。このクエリはうまくいきます。

    "query": {
        "filtered": {
            "filter": {
                "bool": {
                    "must": [{
                        "nested": {
                            "path": "paymentMethods",
                            "query": {
                                "bool": {
                                    "must": [

                                        {
                                            "term": {
                                                "paymentMethods.id": 399
                                            }
                                        }

                                    ]
                                }
                            }
                        }
                    }]
                }
            },
            "query": {
                "match_all": {}
            }
        }
    }

問題は、ID 399 と 194 のすべてのドキュメントが必要なので、試してみたことです。

"must" : [
   { "terms":{"paymentMethods.id" : [399,194]} }
]

しかし、結果はORのようなものです。ANDとして欲しいです。私もこれを試しましたが、まったく機能しません

"must" : [{
    "term": {
        "paymentMethods.id": 399
    }
}, {
    "term": {
        "paymentMethods.id": 194
    }
}]

paymentMethods.id 399 & 194 を取得するにはどうすればよいですか?

ありがとう。

4

1 に答える 1

0

まあ、掘り下げて問題を見つけた後、各bool句(must、should、must_not)には独自のネストされたクエリが必要です。

{"query": {
            "bool": {
                "must": [
                    {
                    "nested": {
                        "path": "paymentMethods",
                        "query": {
                            "term" : { "paymentMethods.id":399 }
                        }
                    }
                },
                {
                    "nested": {
                        "path": "paymentMethods",
                        "query": {
                            "term" : { "paymentMethods.id":187 }
                        }
                    },

等..

一致する用語のいずれかを含むドキュメントを返す「用語」で検索しようとする前に、187または399のドキュメントを取得しました

上記のコードは、ネストされた非表示のドキュメントを 187 に対して 1 回、399 に対して 1 回 2 回クエリし、両方のクエリの交差を返します => 187 と 399 のすべてのドキュメント

(もちろん、2 番目のクエリはすべてのドキュメントに対して再度実行されるわけではなく、前のフィルター結果の結果に対して実行されます)

于 2016-03-14T15:30:04.263 に答える