bugfix> elasticsearch > 投稿

私の構造:

  • Person:タイプオブジェクト。

  • Person.Cars:ネストされたタイプ。

  • Person.Cars.Radios:ネストされたタイプ。

私はすべての人を見つけるはずのクエリを書きたい:

  • 車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番目のパーツを移動する必要があることは知っていますが、その方法はわかりません。

回答 2 件
  • 最初のbool-filterの一部として、2番目のネストされたクエリを追加することをお勧めします。

    {
      "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"
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                }
              ]
            }
          }
        }
      }
    }
    
    

  • @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"
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                }
              ]
            }
          }
        }
      }
    }
    
    

あなたの答え