根据子doc值查找父文档

kan*_*rbk 8 java elasticsearch

我们使用haschild查询根据条件查找父文档.

我们有两种类型

  1. 漏斗
  2. 网页

漏斗样本文档

 {
   "funnel_id": "12345",
   "path": "a -> b -> c"
 }

 {
   "funnel_id": "56789",
   "path": "a -> d"
 }
Run Code Online (Sandbox Code Playgroud)

**页面示例文档**

{
  "_parent": "12345",
  "visited_page": "/home"
}

{
  "_parent": "12345",
  "visited_page": "/cart"
}

{
  "_parent": "12345",
  "visited_page": "/cart"
}
Run Code Online (Sandbox Code Playgroud)

条件1:

查找基于父文档的子文档" visited_pa​​ge "值包含"home".

"must" : {
  "has_child" : {
    "query" : {
      "regexp" : {
        "url" : {
          "value" : ".*home.*",
          "flags_value" : 65535
        }
      }
    },
    "child_type" : "session_pages"
  }
}
Run Code Online (Sandbox Code Playgroud)

它完美地运作.

条件2

查找基于父文档的子文档" visited_pa​​ge "值不包含"home".

"must_not" : {
  "has_child" : {
    "query" : {
      "regexp" : {
        "url" : {
          "value" : ".*home.*",
          "flags_value" : 65535
        }
      }
    },
    "child_type" : "session_pages"
  }
}
Run Code Online (Sandbox Code Playgroud)

但是此查询返回了错误的结果.

输出查询

  {
  "funnel_id": "12345",
  "path": "a -> b -> c"
 }

 {
   "funnel_id": "56789",
   "path": "a -> d"
 }
Run Code Online (Sandbox Code Playgroud)

您可以看到父ID(funnel_id:12345)子文档包含值为"home"的已访问页面.但这也会回归.

预期结果

  {
   "funnel_id": "56789",
   "path": "a -> d"
 }
Run Code Online (Sandbox Code Playgroud)

小智 1

我相信你“不能”在错误的地方尝试:

    "must" : {
  "has_child" : {
    "query" : {
      "regexp" : {
        "url" : {
          "must_not": {
               "value" : ".*home.*"
                       },
          "flags_value" : 65535
        }
      }
    },
    "child_type" : "session_pages"
  }
}
Run Code Online (Sandbox Code Playgroud)