【问题标题】:Searching a subset of nested objects within ElasticSearch documents在 ElasticSearch 文档中搜索嵌套对象的子集
【发布时间】:2013-12-07 00:51:25
【问题描述】:

假设我有用户使用以下文档进行索引:

{
    "name": "Fred Jonsson",
    "age": 24,
    "emails": [
        {
            "active": false,
            "address": "fred.jonsson@burnabyhighschool.ca",
        },
        {
            "active": false,
            "address": "fjonsson4@kpu.ca",
        },
        {
            "active": true,
            "address": "fred@engineeringcorp.com",
        },
        {
            "active": false,
            "address": "fred@jonsson.me",
        },
   }
}

ElasticSearch DSL 是否允许我构建一个查询,在其中我可以通过电子邮件地址搜索人,但前提是地址处于活动状态?用更抽象的术语来说,根据嵌套对象的其他属性来搜索文档。

满足此条件的搜索将返回此文档以搜索 "fred@jonsson.me" 或 "engineeringcorp.com",但不会在搜索 "fred.jonsson@burnabyhighschool.ca" 时返回此文档。

【问题讨论】:

标签: elasticsearch


【解决方案1】:

是的,您只需要在您的文档上启动一个嵌套查询。在您的映射中,您需要将“电子邮件”设置为“类型”:“嵌套”。这将为数组中与此父文档关联的每个对象创建“隐藏”文档。

{
   "query": {
      "nested": {
         "path": "emails",
         "query": {
            "bool": {
               "must": [
                  {
                     "term": {
                        "active": {
                           "value": "true"
                        }
                     }
                  },
                  {
                     "match": {
                        "address": "fred@jonsson.me"
                     }
                  }
               ]
            }
         }
      }
   }
}

【讨论】:

    【解决方案2】:

    例如,如果您想搜索email: fred.jonsson@burnabyhighschool.ca,即active,您可以这样做:

    {
      query: {
        nested: {
          path: 'emails',
          query: {
            bool: {
              must: [
                {
                  term: {
                    'emails.active': true
                  }
                },
                {
                  term: {
                    'emails.address': "fred.jonsson@burnabyhighschool.ca"
                  }
                }
              ]
            }
          }
        }
      }
    }
    

    【讨论】:

    • 感谢您的回答。不幸的是,我没有足够的业力来投票,但我非常感谢你的帮助。这个例子帮助我开始理解 ES DSL 的查询组成。
    猜你喜欢
    • 2018-07-28
    • 2020-06-15
    • 1970-01-01
    • 2020-11-21
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多