弹性搜索,和运算符,嵌套字段

时间:2020-10-06 17:36:59

标签: elasticsearch elasticsearch-dsl

我有一个文档,例如{“ name”:“ abc”,“ age”:“ 20”,“ attributes”:[{“ city”:“ NEW YORK”},{“ city”:“ NEW JERSEY“}]}

,如果我使用YORK JERSEY搜索,我希望查询不返回记录。我使用了“和”运算符,由于在同一个域中进行搜索而不起作用,因为两个地方都存在约克和泽西岛,所以它给了我2条记录,有什么想法吗?而且我还读过有关嵌套字段的信息,但是它需要对数据重新索引,所以有没有对数据重新索引的解决方案吗?

1 个答案:

答案 0 :(得分:1)

对象数组无法正常运行:您无法查询 每个对象独立于数组中的其他对象。如果你 需要能够做到这一点,那么您应该使用嵌套数据类型 而不是对象数据类型。

有关Arrays的ES官方文档,请参阅详细说明,请参阅此SO answer

添加包含索引数据,映射,搜索查询和搜索结果的工作示例

您必须在应用嵌套数据类型之后重新索引数据

索引映射:

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

索引数据:

{
  "name": "abc",
  "age": "20",
  "attributes": [
    {
      "city": "NEW YORK"
    },
    {
      "city": "NEW JERSEY"
    }
  ]
}

搜索查询:

{
    "query": {
        "nested": {
            "path": "attributes",
            "query": {
                "bool": {
                    "must": [
                        {
                            "match": {
                                "attributes.city": "YORK"
                            }
                        },
                        {
                            "match": {
                                "attributes.city": "JERSEY"
                            }
                        }
                    ]
                }
            },
            "inner_hits": {}
        }
    }
}

搜索结果:

不返回结果