当前位置:  开发笔记 > 编程语言 > 正文

如何在ElasticSearch中执行嵌套的AND和OR过滤器?

如何解决《如何在ElasticSearch中执行嵌套的AND和OR过滤器?》经验,为你挑选了1个好方法。

我的过滤器按类别分组.我想检索文档可以匹配类别中的任何过滤器的文档,但如果设置了两个(或更多)类别,则文档必须匹配所有类别中的任何过滤器.

如果用伪SQL编写,它将是:

SELECT * FROM Documents WHERE (CategoryA = 'A') AND (CategoryB = 'B' OR CategoryB = 'C')

我试过像这样的嵌套过滤器:

{
    "sort": [{
        "orderDate": "desc"
    }],
    "size": 25,
    "query": {
        "match_all": {}
    },
    "filter": {
        "and": [{
            "nested": {
                "path":"hits._source",
                "filter": {
                    "or": [{
                        "term": {
                            "progress": "incomplete"
                        }
                    }, {
                        "term": {
                            "progress": "completed"
                        }
                    }]
                }
            }
        }, {
            "nested": {
                "path":"hits._source",
                "filter": {
                    "or": [{
                        "term": {
                            "paid": "yes"
                        }
                    }, {
                        "term": {
                            "paid": "no"
                        }
                    }]
                }
            }
        }]
    }
}

但显然我不太了解ES语法.这是在正确的轨道上还是我需要使用另一个过滤器?



1> Geert-Jan..:

这应该是它(从给定的伪SQL翻译)

{
   "sort": [
      {
        "orderDate": "desc"
      }
    ],
    "size": 25,
    "query":
    {
        "filtered":
        {
            "filter":
            {
                "and":
                [
                    { "term": { "CategoryA":"A" } },
                    {
                        "or":
                        [
                            { "term": { "CategoryB":"B" } },
                            { "term": { "CategoryB":"C" } }
                        ]
                    }
                ]
            }
        }
    }
}

我意识到你并没有提到方面,只是为了完整起见:

您也可以使用a filter作为基础(就像你一样)而不是filtered query(像我一样).得到的json几乎完全相同,区别在于:

过滤后的查询将过滤主要结果以及构面

过滤器只会过滤主要结果而非过滤面.

最后,嵌套过滤器(您尝试使用)与您似乎相信的"嵌套过滤器"无关,但与嵌套文档(父子)的过滤有关

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有