【问题标题】:Elastic search , And operator , Nested fields弹性搜索 , And 运算符 , 嵌套字段
【发布时间】:2021-01-21 15:26:23
【问题描述】:

我有一个类似 { "name": "abc", "age": "20", "attributes": [{ "city": "NEW YORK" }, { "city": "NEW球衣" } ] }

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

【问题讨论】:

  • 您有机会浏览我的回答吗,期待您的反馈????
  • 对不起,我以为我发表了评论,但看起来我没有按回车键,谢谢@Bhavya,它很有帮助,我尝试了你的示例并且它有效。那么除了不重新索引数据之外还有其他解决方法吗?
  • 感谢您的更新????。据我所知,除了使用嵌套查询(我的回答中提到的原因)之外,我认为没有其他方法可以实现您的用例。请不要忘记接受并支持我的回答????

标签: elasticsearch elasticsearch-dsl


【解决方案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": {}
        }
    }
}

搜索结果:

不返回任何结果

【讨论】:

  • 是的,我重新索引了数据,它适用于上面的例子,再次感谢@Bhavya
猜你喜欢
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
相关资源
最近更新 更多