elasticsearch Elastic Search AND和OR条件未返回正确的数据

tjjdgumg  于 2023-04-11  发布在  ElasticSearch
关注(0)|答案(1)|浏览(127)

我有来自两个文档源的数据,一个具有购买状态,另一个没有购买状态。为了识别购买状态,我使用了一个名为purchase的嵌套对象,它具有purchase.location和purchase.purchased_on。因此,我能够识别第二种情况下的项目是购买的。
我正在构建一个过滤器,并希望过滤购买的项目,它应该返回我的数据与文档具有购买状态或应该有purchase.location作为其中一个值和purchase.purchased_on应该大于1。
我构建的Elastic Search查询是

{
 "query": {
   "bool": {
     "should": [
       {
         "terms": {
           "status": [
             "purchased"
           ]
         }
       },
       {
         "bool": {
           "should": [
             {
               "terms": {
                 "purchase.location": [
                   "flipkart",
                   "amazon",
                   "bestbuy"
                 ]
               }
             },
             {
               "range": {
                 "purchase.purchased_on": {
                   "gte": 1
                 }
               }
             }
           ]
         }
       }
     ]
   }
 }
}

只返回购买状态的数据,不返回其他状态的数据。

yx2lnoni

yx2lnoni1#

使用嵌套查询,

{
    "query": {
        "bool": {
            "should": [
                {
                    "terms": {
                        "status": [
                            "purchased"
                        ]
                    }
                },
                {
                    "nested": {
                        "path": "purchase",
                        "query": {
                            "bool": {
                                "should": [
                                    {
                                        "terms": {
                                            "purchase.location": [
                                                "flipkart",
                                                "amazon",
                                                "bestbuy"
                                            ]
                                        }
                                    },
                                    {
                                        "range": {
                                            "purchase.purchased_on": {
                                                "gte": 1
                                            }
                                        }
                                    }
                                ],
                                "minimum_should_match": 1
                            }
                        }
                    }
                }
            ],
            "minimum_should_match": 1,
            "boost": 1.0
        }
    }
}

结果就是

{
    "took": 47,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 3,
            "relation": "eq"
        },
        "max_score": 1.287682,
        "hits": [
            {
                "_index": "purchase",
                "_type": "_doc",
                "_id": "yb5za4cB6Rdc8HbD9stk",
                "_score": 1.287682,
                "_source": {
                    "purchase": [
                        {
                            "location": "flipkart",
                            "purchased_on": "2"
                        }
                    ]
                }
            },
            {
                "_index": "purchase",
                "_type": "_doc",
                "_id": "yr50a4cB6Rdc8HbD_cto",
                "_score": 1.0,
                "_source": {
                    "status": "purchased"
                }
            },
            {
                "_index": "purchase",
                "_type": "_doc",
                "_id": "y753a4cB6Rdc8HbDCcuM",
                "_score": 1.0,
                "_source": {
                    "purchase": [
                        {
                            "purchased_on": "4"
                        }
                    ]
                }
            }
        ]
    }
}

相关问题