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

时间:2015-12-21 16:49:28

标签: elasticsearch nest elasticsearch-plugin booleanquery

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

  

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

  1. 数据库中的每个文档都链接到特定的profileId 反过来有多个属性
  2. 每个文档都有多个与之关联的属性值
  3. 在此查询中,我试图获取具有特定配置文件和属性值的所有文档> 30请记住,此属性应仅具有属性Id 2。

    SQL查询:

    从文档d内连接attributeValue av中选择av。*,d.name  上  d.DocumentId = av.DocumentId  其中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(值<&lt; 30)
    2. 属性值= 34但属性ID不同于2 (不正确)
    3. 不得包含此文件,因为它不符合我的需要。

      如何构建此查询?

1 个答案:

答案 0 :(得分:2)

解决方案是首先通过使lstChildren成为嵌套对象来更改映射。然后使用嵌套查询将确保满足指定的所有条件。下面的嵌套查询指定了两个只返回预期结果的条件,但我使用“Equal”代替“IntValue”的“大于”,以保持简单:

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