我目前正在寻找构建一个 Elasticsearch 过滤器(用于我的查询)来过滤我的查询,但它失败了,因为过滤器也没有过滤。
ES 集群版本为 6.8.3。这是我当前的过滤器代码(PHP版本):
'filter' => [
['term' =>
[
'displayMode' => 'hidden'
]],
[ 'bool' => [
'must_not' => [
[ 'bool' => [
'must' => [
'term' => ['displayMode' => 'untreated']
]
]],
[ 'bool' => [
'must' => [
'term' => [ 'lifetime' => 'temporary' ]
]
]]
]]
],
[ 'bool' => [
'must' => [
[ 'bool' => [
'must_not' => [
'term' => ['activity' => 'inactive']
]
]],
[ 'bool' => [
'must_not' => [
'term' => [ 'lifetime' => 'everlasting' ]
]
]],
[ 'bool' => [
'should' => [
[ 'range' => [
'toDate' => [
'lt' => (new \DateTime())->format('Y-m-d')
]
]],
[ 'bool' => [
'must_not' => [
'exists' => [
'field' => 'toDate'
]
]
]]
]
]]
]
]]
]
因此,要显示一个项目,您必须遵守所有这些条件:
item.displayAll != 'hidden'
和
(item.displayMode != 'untreated' AND item.lifetime != 'temporary')
并且
(item.activity != 'inactive' AND item.lifetime != 'everlasting' AND item.toDate < NOW())
不幸的是,我的“多”术语条件不是多的,所以每个子过滤器似乎都是一个接一个地执行。因此,如果我的项目“未经处理”但其“生命周期”不是“临时”,则该项目正在过滤但不应该过滤。
编辑:当我尝试简化我的过滤器时(只是为了检查小家伙是否在工作)它也不起作用......
// ...
'filter' => [
['bool' => [
'must_not' => [
['term' => [ 'displayMode' => 'untreated' ]],
['term' => [ 'lifetime' => 'temporary' ]]
]
]],
// ...
或者
'filter' => [
['bool' => [
'must' => [
['bool' => [
'must_not' => [
['term' => [ 'displayMode' => 'untreated' ]],
]
]],
['bool' => [
'must_not' => [
['term' => [ 'lifetime' => 'temporary' ]]
]
]]
]
]],
(上面的两个示例不起作用,因为它过滤了所有结果,甚至是有效的结果)
或者
'filter' => [
['bool' => [
'should' => [
['bool' => [
'must_not' => [
['term' => [ 'displayMode' => 'untreated' ]],
]
]],
['bool' => [
'must_not' => [
['term' => [ 'lifetime' => 'temporary' ]]
]
]]
]
]],
(上面的例子,它没有像我想要的那样过滤任何东西)。
或者
'filter' => [
['bool' => [
'must_not' => [
['term' => [ 'displayMode' => 'untreated' ]],
['term' => [ 'lifetime' => 'temporary' ]]
]
]]
同上,它正在过滤所有结果..
任何人都可以帮助我吗?