0

我目前正在寻找构建一个 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' ]]
                                    ]
                                ]]

同上,它正在过滤所有结果..

任何人都可以帮助我吗?

4

2 回答 2

2

因此,根据您的布尔逻辑,您可以简单地将其转换为bool查询:

  • AND=>filter
  • OR=>should
  • !==>must_not

它会产生这个:

{
  "query": {
    "bool": {
      "minimum_should_match": 1,
      "should": [
        {
          "bool": {
            "must_not": {
              "term": {
                "displayMode": "hidden"
              }
            }
          }
        },
        {
          "bool": {
            "must_not": [
              {
                "term": {
                  "displayMode": "untreated"
                }
              },
              {
                "term": {
                  "lifetime": "temporary"
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must_not": [
              {
                "term": {
                  "activity": "inactive"
                }
              },
              {
                "term": {
                  "lifetime": "everlasting"
                }
              },
              {
                "bool": {
                  "should": [
                    {
                      "range": {
                        "toDate": {
                          "lt": "now"
                        }
                      }
                    },
                    {
                      "bool": {
                        "must_not": {
                          "exists": {
                            "field": "toDate"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  }
}
于 2020-02-18T10:00:57.993 回答
0

因此,在浪费了大量时间之后,我终于意识到我的索引不包含“生命周期”字段。为此,所有过滤条件都失败了。我的第一个查询是一个很好的查询(或一种做我想做的事情的方法)。祝你有美好的一天。

于 2020-02-20T09:57:13.783 回答