弹性搜索:父和子的嵌套查询和条件

时间:2017-01-04 14:24:09

标签: elasticsearch

我有2个样本记录如下:

{
    "parents": [
      {
        "child": [
          {
            "is_deleted": false,
            "child_id": -1,
            "timestamp": 1483536052232
          }
        ],
        "parent_id": 810
      },
      {
        "child": [
          {
            "is_deleted": true,
            "child_id": 105,
            "timestamp": 1483537567000
          }
        ],
        "parent_id": 42
      }
    ]
},
{
  "parents": [
      {
        "child": [
          {
            "is_deleted": false,
            "child_id": 105,
            "timestamp": 1483537567000
          }
        ],
        "parent_id": 42
      }
    ]
}

和我的映射:

"properties": {
  "parents": {
    "type": "nested",
    "properties": {
      "parent_id": {
        "type": "integer",
        "doc_values": false
      },
      "child": {
        "type": "nested",
        "properties": {
          "is_deleted": {
            "type": "boolean",
            "doc_values": false
          },
          "child_id": {
            "type": "integer",
            "doc_values": false
          },
          "timestamp": {
            "type": "long",
            "doc_values": false
          }
        }
      }
    }
  }

我想通过父ID进行搜索,该ID至少有一个is_deletedfalse的孩子为$.validator.addMethod('validEmail', function(value, element) { var emailRegex = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/; return emailRegex.test(value); }, i18n.t('Invalid email address')); 。例如,如果我将查询父ID 42,我应该只获得第二个文件。

1 个答案:

答案 0 :(得分:1)

您应该使用嵌套查询来查询嵌套字段。

这是一个例子,但我不知道这是否是最好的解决方案,至少它是一个有效的解决方案:

POST /test1/test/_search
{
   "query": {
      "nested": {
         "path": "parents",
         "query": {
            "bool": {
               "must": [
                  {
                     "match": {
                        "parents.parent_id": 42
                     }
                  },
                  {
                     "nested": {
                        "path": "parents.child",
                        "query": {
                           "term": {
                              "parents.child.is_deleted": "F"
                           }
                        }
                     }
                  }
               ]
            }
         }
      }
   }
}