Elasticsearch:如何添加"嵌套查询"进入(嵌套)过滤器

时间:2018-05-25 11:11:33

标签: elasticsearch

我的结构:

  • 人:类型对象。

  • Person.Cars:类型嵌套。

  • Person.Cars.Radios:type nested。

我想写一个查询,找到所有人:

  • Car X
  • 汽车年份从40到100
  • 车内电台Y
 {
      "query": {
        "nested": {
          "path": "person.cars",
          "query": {
            "bool": {
              "filter": [
                {
                  "match": {
                    "person.cars.id": {
                      "query": "X"
                    }
                  }
                },
                {
                  "range": {
                    "person.cars.year": {
                      "from": 40,
                      "to": 100
                    }
                  }
                }
              ]
            },
            "nested": {
              "path": "person.cars.radios",
              "query": {
                "bool": {
                  "filter": [
                    {
                      "match": {
                        "person.cars.radios.id": {
                          "query": "Y"
                        }
                      }
                    }
                  ]
                }
              }
            }
          }
        }
      }
    }

我的回答:

{
    "error": {
        "root_cause": [
            {
                "type": "parsing_exception",
                "reason": "[bool] malformed query, expected [END_OBJECT] but found [FIELD_NAME]",
                "line": 26,
                "col": 5
            }
        ],
        "type": "parsing_exception",
        "reason": "[bool] malformed query, expected [END_OBJECT] but found [FIELD_NAME]",
        "line": 26,
        "col": 5
    },
    "status": 400
}

如何写这样的查询?我知道我必须移动我的第二个嵌套部分,但我不知道如何。

2 个答案:

答案 0 :(得分:1)

我建议您添加第二个嵌套查询作为第一个bool过滤器的一部分。

 {
  "query": {
    "nested": {
      "path": "person.cars",
      "query": {
        "bool": {
          "filter": [
            {
              "match": {
                "person.cars.id": {
                  "query": "X"
                }
              }
            },
            {
              "range": {
                "person.cars.year": {
                  "from": 40,
                  "to": 100
                }
              }
            },
            {
              "nested": {
                "path": "person.cars.radios",
                "query": {
                  "bool": {
                    "filter": [
                      {
                        "match": {
                          "person.cars.radios.id": {
                            "query": "Y"
                          }
                        }
                      }
                    ]
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}

答案 1 :(得分:0)

@jordivador你是如此接近。:)只需在范围过滤后删除查询键。

好主意:使用Java API - 检查如何编写查询。

{
  "query": {
    "nested": {
      "path": "person.cars",
      "query": {
        "bool": {
          "filter": [
            {
              "match": {
                "person.cars.id": {
                  "query": "X"
                }
              }
            },
            {
              "range": {
                "person.cars.year": {
                  "from": 40,
                  "to": 100
                }
              }
            },
            {
              "nested": {
                "path": "person.cars.radios",
                "query": {
                  "bool": {
                    "filter": [
                      {
                        "match": {
                          "person.cars.radios.id": {
                            "query": "Y"
                          }
                        }
                      }
                    ]
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}