嵌套搜索bool查询必须和应该运算符

时间:2015-06-19 10:33:20

标签: elasticsearch

我正在尝试嵌套聚合并在其上应用过滤器。

请参阅以下示例:

汽车

  • 品牌
  • 名称
  • 功能

功能

  • 名称

以下是一些测试数据:

car_A:
{
 brand :"VW",
 name: "Golf",
 features: [
  {name: "color", value: "black"},
  {name: "power", value: "150"}
 ]
}

car_B:
{
 brand :"VW",
 name: "Golf",
 features: [
  {name: "color", value: "blue"},
  {name: "power", value: "150"}
 ]
}

car_C:
{
 brand :"VW",
 name: "Golf",
 features: [
  {name: "color", value: "white"},
  {name: "power", value: "150"}
 ]
}

car_D:
{
 brand :"BMW",
 name: "X3",
 features: [
  {name: "color", value: "white"},
  {name: "power", value: "180"}
 ]
}

car_E:
{
 brand :"BMW",
 name: "X5",
 features: [
  {name: "color", value: "blue"},
  {name: "power", value: "250"}
 ]
}

car_F:
{
 brand :"BMW",
 name: "X3",
 features: [
  {name: "color", value: "blue"},
  {name: "power", value: "150"}
 ]
}

这是查询:

"query": {
"nested": {
  "path": "features",
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "features.color": "blue"
          }
        },
        {
          "match": {
            "features.color": "white"
          }
        }
      ],
      "must": [
        {"match": {
          "features.power": 150
        }}
      ]
    }
  }
 }
} 

查询结果为A,B,C,F

预期结果应为B,C,F(颜色=蓝色 OR 颜色=白色) AND 功率= 150

1 个答案:

答案 0 :(得分:2)

尝试此查询:

"query": {
"nested": {
  "path": "features",
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "features.color": "blue"
          }
        },
        {
          "match": {
            "features.color": "white"
          }
        }
      ],
      "must": [
        {"match": {
          "features.power": 150
        }}
      ]
    }
  }
 }
} 

意思是,您在查询中使用的字段应以path的名称为前缀:features.colorfeatures.power

修改

尝试此查询(我在此错过了必要的内容 - 您需要两个must,一个是bool should s):

{
  "query": {
    "nested": {
      "path": "features",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "features.power": 150
              }
            },
            {
              "bool": {
                "should": [
                  {
                    "match": {
                      "features.color": "blue"
                    }
                  },
                  {
                    "match": {
                      "features.color": "white"
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
  }
}