一尘不染

Nest ElasticSearch:使用嵌套查询和嵌套对象的布尔搜索

elasticsearch

我正在使用Nest Elastic并使用Head插件为布尔搜索构建查询,我正在合并多个查询

有关数据库结构和弹性映射的注释

  1. 数据库中的每个文档都链接到特定的profileId,后者又具有多个属性
  2. 每个文档都有与其关联的多个属性值

在此查询中,我要获取具有特定配置文件和属性值> 30的所有文档,同时要记住,此属性应仅具有ID 2。

SQL查询:

从文档d内部联接attributeValue中选择av。*,d.name d.DocumentId =
av.DocumentId上的av,其中d.profileid = 1和av.AttributeId = 2且av.Intvalue> 30

弹性查询

   { "query": {
    "bool": {
    "must": [
    {
       "term": { "Document.profileid": "1"  }
    }
    ,
    {
      "term": {"Document.lstChildren.AttributeID": "2" }
    }
    ,
    { 
      "range": { "Document.lstChildren.IntValue": { "gt": "30"} }
    }
    ,
    {
    "match_all": { }
    }
    ],
    "must_not": [ ],
    "should": [ ]
    }
    },   "from": 0, "size": 10, "sort": [ ], "facets": { }
    }

问题

结果还包含一个具有以下属性值的文档

  1. 属性值= 3,attributeId = 2(值<30)
  2. 属性值= 34,但attributeId不同于2 (不正确)

不能包含此文档,因为它不能满足我的需求。

如何建立此查询?


阅读 297

收藏
2020-06-22

共1个答案

一尘不染

解决方案是通过使lstChildren成为嵌套对象来首先更改映射。然后,使用嵌套查询将确保符合指定的所有条件。下面的嵌套查询指定了两个仅返回预期结果的条件,但是为了简单起见,我对“
IntValue”使用“等于”而不是“大于”:

{
  "query": {
    "nested": {
      "path": "lstChildren",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "lstChildren.AttributeID":"2"
              }
            },
            {
              "match": {
                "lstChildren.IntValue": "31"
              }
            }
          ]
        }
      }
    }
  }
}
2020-06-22