Я хочу получить данные с другим значением, но с тем же именем поля в массиве объекта

У меня есть эти данные с массивом объекта stringFacets, содержащим критерии в поиске эластичного 7.9

{
    "took": 2238,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": [{
        "stringFacets": [{
                "name": "criterion",
                "value": "Accès Wifi"
            },
            {
                "name": "criterion",
                "value": "Piscine"
            }
        ]
    }]
}

Я хочу, чтобы в моем поиске были документы, в которых stringFacets.name = "criterion" и stringFacets.value = "Piscine" и stringFacets.value = "Accès Wifi"

Я пробовал это, но безрезультатно

{
    "query": {
        "bool": {
            "must": [
                {
                    "nested": {
                        "path": "stringFacets",
                        "query": {
                            "bool": {
                              "must": [
                         {
                            "term": {
                                    "stringFacets.name": "criterion"
                                }
                              },
                                {
                                    "term": {
                                            "stringFacets.value": "Piscine"
                                        } 
                              },
                               {
                                    "term": {
                                            "stringFacets.value": "Accès Wifi"
                                        }
                              }
                              ]
                            }
                        }
                    }
                }
            ]
        }
    }

Мое отображение

{
    "settings": {
        "number_of_shards": "1"
    },
    "mappings": {
        "dynamic": false,
        "dynamic_templates": [{
            "results": {
                "mapping": {
                    "type": "text",
                    "index": false
                },
                "path_match": "results.*"
            }
        }
        ],
        "properties": {
            "@version" : {
                "type" : "text",
                "fields" : {
                    "keyword" : {
                        "type" : "keyword",
                        "ignore_above" : 256
                    }
                }
            },
            "@timestamp" : {
                "type" : "date"
            },
            "booleanFacets": {
                "type": "nested",
                "properties": {
                    "name": {
                        "type": "keyword"
                    },
                    "value": {
                        "type": "boolean"
                    }
                }
            },
            "stringFacets": {
                "type": "nested",
                "properties": {
                    "name": {
                        "type": "keyword"
                    },
                    "value": {
                        "type": "keyword"
                    }
                }
            },
            "locationFacets": {
                "type": "geo_point"
            },
            "integerFacets": {
                "type": "nested",
                "properties": {
                    "name": {
                        "type": "keyword"
                    },
                    "value": {
                        "type": "long"
                    }
                }
            },
            "decimalFacets": {
                "type": "nested",
                "properties": {
                    "name": {
                        "type": "keyword"
                    },
                    "value": {
                        "type": "double"
                    }
                }
            },
            "datetimeFacets": {
                "type": "nested",
                "properties": {
                    "name": {
                        "type": "keyword"
                    },
                    "value": {
                        "type": "date"
                    }
                }
            },
            "availabilities": {
                "type": "nested",
                "properties": {
                    "start": {
                        "type": "date",
                        "format": "yyyy-MM-dd HH:mm:ss.SSSSSS"
                    },
                    "end": {
                        "type": "date",
                        "format": "yyyy-MM-dd HH:mm:ss.SSSSSS"
                    },
                    "price": {
                        "type": "double"
                    },
                    "duration": {
                        "type": "long"
                    }
                }
            }
        }
    }
}

Благодарность

0
jikaill 12 Фев 2021 в 13:43

1 ответ

Лучший ответ

Вложенный тип - это специализированная версия типа данных объекта, которая позволяет индексировать массивы объектов таким образом, чтобы их можно было запрашивать независимо друг от друга.

Вы получаете 0 результатов, потому что в ваших выборочных данных нет ни одного объекта, который бы соответствовал всем трем условиям.

Вы можете использовать inner_hits. в результате внутренний вложенный запрос автоматически соответствует соответствующему уровню вложенности, а не корню

Измените свой запрос как

 {
  "query": {
    "nested": {
      "path": "stringFacets",
      "query": {
        "bool": {
          "should": [
            {
              "term": {
                "stringFacets.name": "criterion"
              }
            },
            {
              "term": {
                "stringFacets.value": "Piscine"
              }
            },
            {
              "term": {
                "stringFacets.value": "Accès Wifi"
              }
            }
          ],
         "minimum_should_match":2
        }
      },
      "inner_hits": {}
    }
  }
}

Результат поиска будет

"hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 0.8754687,
    "hits": [
      {
        "_index": "66170374",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.8754687,
        "_source": {
          "stringFacets": [
            {
              "name": "criterion",
              "value": "Accès Wifi"
            },
            {
              "name": "criterion",
              "value": "Piscine"
            }
          ]
        },
        "inner_hits": {
          "stringFacets": {
            "hits": {
              "total": {
                "value": 2,
                "relation": "eq"
              },
              "max_score": 0.8754687,
              "hits": [
                {
                  "_index": "66170374",
                  "_type": "_doc",
                  "_id": "1",
                  "_nested": {
                    "field": "stringFacets",
                    "offset": 0
                  },
                  "_score": 0.8754687,
                  "_source": {
                    "name": "criterion",       // note this
                    "value": "Accès Wifi"
                  }
                },
                {
                  "_index": "66170374",
                  "_type": "_doc",
                  "_id": "1",
                  "_nested": {
                    "field": "stringFacets",
                    "offset": 1
                  },
                  "_score": 0.8754687,
                  "_source": {
                    "name": "criterion",       // note this
                    "value": "Piscine"
                  }
                }
              ]
            }
          }
        }
      }
    ]
  }
1
ESCoder 15 Фев 2021 в 03:06