将 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 的单个或过滤器,查询结构看起来像是增加了,但在整体组合中,结构几乎相似。
我在过滤查询中有以下过滤器。如图所示,它有许多 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 的单个或过滤器,查询结构看起来像是增加了,但在整体组合中,结构几乎相似。