Elasticsearch: как добавить «вложенный запрос» в (вложенный) фильтр - PullRequest
0 голосов
/ 25 мая 2018

Моя структура:

  • Person: тип объекта.

  • Person.Cars: тип вложенный.

  • Person.Cars.Radios: тип 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 голосов
/ 25 мая 2018

@ 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"
                          }
                        }
                      }
                    ]
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}
0 голосов
/ 25 мая 2018

Я предлагаю вам добавить второй вложенный запрос как часть вашего первого 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"
                          }
                        }
                      }
                    ]
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...