根据子doc值查找父文档

时间:2018-01-29 19:18:23

标签: java elasticsearch

我们正在使用 haschild 查询根据条件查找父文档。

我们有两种类型

  1. 漏斗
  2. 漏斗示例文档

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

    **页样本doc **

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

    条件1:

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

    "must" : {
      "has_child" : {
        "query" : {
          "regexp" : {
            "url" : {
              "value" : ".*home.*",
              "flags_value" : 65535
            }
          }
        },
        "child_type" : "session_pages"
      }
    }
    

    效果很好。

    条件2

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

    "must_not" : {
      "has_child" : {
        "query" : {
          "regexp" : {
            "url" : {
              "value" : ".*home.*",
              "flags_value" : 65535
            }
          }
        },
        "child_type" : "session_pages"
      }
    }
    

    但是这个查询返回了错误的结果。

    查询的输出

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

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

    预期结果

      {
       "funnel_id": "56789",
       "path": "a -> d"
     }
    

1 个答案:

答案 0 :(得分:1)

我相信你已经"必须不在错误的地方 尝试:

    "must" : {
  "has_child" : {
    "query" : {
      "regexp" : {
        "url" : {
          "must_not": {
               "value" : ".*home.*"
                       },
          "flags_value" : 65535
        }
      }
    },
    "child_type" : "session_pages"
  }
}