如何使用has_child过滤器排除文档



我的弹性搜索中有以下映射:

my_parent-父类型

my_child-子类型(与my_parent有多对一关系)

假设my_child具有字段name

我想做的是获取所有没有任何子文档的my_parent文档,其中name等于test

以下是SQL中的等价项:

SELECT * FROM my_parent WHERE id NOT IN ( SELECT DISTINCT parent_id FROM my_child WHERE name = 'test' )

这可以在弹性搜索中在单个查询中完成吗?或者我应该使用2个查询?

您可以使用has_childbool must_not查询来实现您想要的查询。

POST <indexname>/my_parent/_search
{
   "query": {
      "bool": {
         "must_not": [
            {
               "has_child": {
                  "type": "my_child",
                  "query": {
                     "term": {
                        "name": {
                           "value": "test"
                        }
                     }
                  }
               }
            }
         ]
      }
   }
}

https://www.elastic.co/guide/en/elasticsearch/guide/current/has-child.html

你可以看看上面的链接,他们已经提到了如何让父母基于孩子。。。

您将该查询放入bool过滤器/查询的must_not子句中。。

https://www.elastic.co/guide/en/elasticsearch/guide/current/combining-filters.html#bool-过滤器?q=布尔滤波器

这是关于如何使用bool过滤器的链接。。

如果您需要更深入的解释,请告诉我

最新更新