将 OR/AND/NOT 过滤器替换为 bool 过滤器会创建一个层次过多的难以理解的查询?

Replacing OR/AND/NOT filters with bool filter creates a hard-to-understand query with too many levels?

我在过滤查询中有以下过滤器。如图所示,它有许多 OR/AND/NOT 个不同级别的过滤器。出于性能原因,我被建议用 bool 过滤器替换它们,我打算这样做。

"filter" : {
                "or" : [

                    {
                        "and" : [
                            { "range" : { "start" : { "lte": 201407292300 } } },
                            { "range" : { "end" : { "gte": 201407292300 } } },
                            { "term" : { "condtion1" : false } },
                            {
                                "or" : [
                                    {
                                        "and" : [
                                            { "term" : { "condtion2" : false } },
                                            {
                                                "or": [
                                                    {
                                                        "and" : [
                                                            { "missing" : { "field" : "condtion6" } },
                                                            { "missing" : { "field" : "condtion7" } }
                                                        ]
                                                    },
                                                    { "term" : { "condtion6" : "nop" } }
                                                    { "term" : { "condtion7" : "rst" } }
                                                ]
                                            }
                                        ]
                                    },
                                    {
                                        "and" : [
                                            { "term" : { "condtion2" : true } },
                                            {
                                                "or": [
                                                    {
                                                        "and" : [
                                                            { "missing" : { "field" : "condtion3" } },
                                                            { "missing" : { "field" : "condtion4" } },
                                                            { "missing" : { "field" : "condtion5" } },
                                                            { "missing" : { "field" : "condtion6" } },
                                                            { "missing" : { "field" : "condtion7" } }
                                                        ]
                                                    },
                                                    { "term" : { "condtion3" : "abc" } },
                                                    { "term" : { "condtion4" : "def" } },
                                                    { "term" : { "condtion5" : "ghj" } },
                                                    { "term" : { "condtion6" : "nop" } },
                                                    { "term" : { "condtion7" : "rst" } }
                                                ]
                                            }                                       
                                        ]
                                    }
                                ]
                            }

                        ]
                    },

                    {
                        "and" : [
                            { 
                                "term": { "condtion8" : "TIME_POINT_1" } 
                            },
                            {  "range" : { "start" : { "lte": 201407302300 } } },
                            { 
                                "or": [
                                    { "term" : { "condtion9" : "GROUP_B" } }, 
                                    {
                                        "and" : [
                                            { "term" : { "condtion9" : "GROUP_A" } },
                                            { "ids" : { values: [100, 10] } }
                                        ] 
                                    }
                                ]
                            }
                        ]
                    },

                    {
                        "and" : [
                            { 
                                "term": { "condtion8" : "TIME_POINT_2" } 
                            },
                            { "ids" : { values: [100, 10] } }
                        ]
                    },                  

                    {
                        "and" : [
                            { 
                                "term": { "condtion8" : "TIME_POINT_3" } 
                            },
                            { 
                                "or": [
                                    { "term" : { "condtion1" : true } },
                                    { "range" : { "end" : { "lt": 201407302300 } } }
                                ]
                            },
                            { 
                                "or": [
                                    { "term" : { "condtion9" : "GROUP_B" } }, 
                                    {
                                        "and" : [
                                            { "term" : { "condtion9" : "GROUP_A" } },
                                            { "ids" : { values: [100, 10] } }
                                        ] 
                                    }
                                ]
                            }
                        ]
                    }

                ]
            }

但是,我觉得替换这些 OR/AND/NOT 过滤器会创建一个层次过多且难以理解的查询。例如,替换

"or": [
   ....
]

我必须有:

"bool" {
   "should": [
    ]
}

在我的案例中,用布尔过滤器替换 OR/AND/NOT 是以牺牲可理解性为代价的,我说得对吗?

相关问题

如果我必须更换 OR/AND/NOT 过滤器以提高性能,我应该更换 ALL 这些 OR/AND/NOT 过滤器,还是只更换其中的一部分,例如例如顶部的一个?

感谢和问候。

除 geo/script/range 个过滤器外,您应该更换所有过滤器。话虽如此,了解每个过滤器的可能影响也可以帮助您。例如,如果其中一个过滤器要过滤掉 90% 的结果,那么您可能希望在开始时将其放入和过滤器中。由于 and/or 个过滤器按顺序执行,其余过滤器将处理较少的文档。在 bool 过滤器的情况下,所有过滤器都组合在一个 bitset 操作中。您可能已经 read about it.

我不认为你会通过用 bool 过滤器替换 OR/AND/NOT 来牺牲不稳定性。正如您给出的示例,对于转换为 should filter 的单个或过滤器,查询结构看起来像是增加了,但在整体组合中,结构几乎相似。