ElasticSearch中如何在嵌套域中同时搜索单个对象的两个域

cu6pst1q  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(2)|浏览(315)

我的elasticsearch中有一个嵌套字段。假设这样的数据存储在这个字段中:

{
"id" : 1,
"students":[
     {"name": "John", "age": 20},{"name": "Alexander", "age":25},{"name": "Elizabeth", "age": 15}
    ]
},
"id" : 2,
"students":[
       {"name": "John", "age": 23},{"name": "Thomas", "age":30}
      ]
}

我怎样才能查询到那些有学生“约翰”和他的“年龄”超过21岁的文件。如果查询工作正常,第一个文档将不会作为答案重新检索,因为“john”已经20岁了,我们正在寻找一个至少21岁的“john”。因此,必须检索第二个文档。谢谢你的帮助。

q35jwt9p

q35jwt9p1#

您需要使用带有源筛选的内部点击的嵌套查询来获得更好格式的预期输出。
另外,请参考内部点击,以便您可以对您的查询和搜索结果进行高级操作。
索引Map,其中包括 .keyword 字段,以便检索文本字段的字段值

{
    "mappings": {
        "properties": {
            "id": {
                "type": "long"
            },
            "students": {
                "type" : "nested",
                "properties": {
                    "age": {
                        "type": "long"
                    },
                    "name": {
                        "type": "text",
                        "fields": {
                            "keyword": {
                                "type": "keyword",
                                "ignore_above": 256
                            }
                        }
                    }
                }
            }
        }
    }
}

为有问题的示例文档编制索引,并搜索查询以检索嵌套文档

{
    "query": {
        "nested": {
            "path": "students",
            "query": {
                "bool": {
                    "must": [
                        {
                            "match": {
                                "students.name": "John"
                            }
                        },
                        {
                            "range": {
                                "students.age": {
                                    "gt": 20
                                }
                            }
                        }
                    ]
                }
            },
            "inner_hits": {
                "_source": false,
                "docvalue_fields": [
                    {
                        "field": "students.name.keyword",
                        "format": "use_field_mapping"
                    }
                ]
            }
        }
    }
}

和内部搜索结果

"inner_hits": {
                    "students": {
                        "hits": {
                            "total": {
                                "value": 1,
                                "relation": "eq"
                            },
                            "max_score": 1.8754687,
                            "hits": [
                                {
                                    "_index": "nestedstudent",
                                    "_type": "_doc",
                                    "_id": "2",
                                    "_nested": {
                                        "field": "students",
                                        "offset": 0
                                    },
                                    "_score": 1.8754687, // note this
                                    "fields": {
                                        "students.name.keyword": [
                                            "John"
                                        ]
                                    }
                                }
                            ]
                        }
                    }
                }
            }
wxclj1h5

wxclj1h52#

添加索引Map、搜索查询和搜索结果的工作示例
索引Map:

{
  "mappings": {
    "properties": {
      "students": {
        "type": "nested"
      }
    }
  }
}

搜索查询:

{
  "query": {
    "nested": {
      "path": "students",
      "query": {
        "bool": {
          "must": [
            { "match": { "students.name": "John" } },
            { "range": { "students.age": { "gt": 21 } } }
          ]
        }
      }
    }
  }
}

搜索结果:

"hits": [
      {
        "_index": "64460956",
        "_type": "_doc",
        "_id": "2",
        "_score": 1.8754687,
        "_source": {
          "id": 2,
          "students": [
            {
              "name": "John",
              "age": 23
            },
            {
              "name": "Thomas",
              "age": 30
            }
          ]
        }
      }
    ]

相关问题