在ElasticSearch文档中搜索嵌套对象的子集

时间:2013-12-04 15:06:51

标签: elasticsearch

假设我的用户使用以下文档编制索引:

{
    "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"时不会返回此文档。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

例如,如果您要搜索email: fred.jonsson@burnabyhighschool.ca active,则可以执行以下操作:

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