首页 > 解决方案 > 弹性搜索 , And 运算符 , 嵌套字段

问题描述

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

如果我使用 YORK JERSEY 搜索,我希望查询返回 NO 记录。我使用了“and”运算符,但它不起作用,因为我在同一个字段而不是多个字段上搜索,因为 york 和 jersey 在这两个地方都存在,它给了我 2 条记录,有什么想法吗?而且我还阅读了有关嵌套字段的信息,但它需要重新索引数据,所以有没有重新索引数据的解决方案?

标签: elasticsearchelasticsearch-dsl

解决方案


对象数组不会像您期望的那样工作:您不能独立于数组中的其他对象查询每个对象。如果您需要能够做到这一点,那么您应该使用嵌套数据类型而不是对象数据类型。

详细解释请参考这篇关于Arrays的ES官方文档,请参考this 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": {}
        }
    }
}

搜索结果:

不返回结果


推荐阅读