如何在Yii2 elasticsearch中混合$ query-> andFilterWhere和$ query->查询

时间:2018-02-15 18:55:45

标签: elasticsearch yii2 elasticsearch-6

我将yii2系统从yii2-elasticsearch 2.0更新为2.1,将elasticsearch包从2.2.1更新到6.2.1。在旧系统中,我可以将$query->andFilterWhere$query->query混合如下(搜索方法位于从yii\elasticsearch\ActiveRecord派生的类中):

public function search($params)
{
    $query = self::find();

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);

    $this->load($params);

    $query->andFilterWhere([
        'languageCode' => \Yii::$app->locale->languageCode,
    ]);

    $queryPart = [];
    if (!empty($this->term)) {
        $queryPart['filtered']['query']['multi_match'] = [
        // ES6: $queryPart['bool']['must']['multi_match'] = [
            'query' => $this->term,
            'operator' => 'and',
            'type' => $this->getQueryType($this->term),
            'fields' => [
                'name_*',
                'meta_description_*'
            ]
        ];
    }

    if (!empty($queryPart)) {
        $query->query($queryPart);
    }

    return $dataProvider;
}

它与ES 2.2.1一起使用没有任何问题,但现在andFilterWhere独立于序列覆盖$query->query。如果两个部件中的一个被移除,则另一个过滤器完美地工作,而不是一起。 有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您必须使用bool查询并将查询的所有部分放在一个"查询"宾语... 像这样:

query => [
      bool => [ 
          must => [
               multi_match => [
                        'query' => $this->term,
                        'operator' => 'and', 
                        'type' => $this->getQueryType($this->term), 
                        'fields' => [
                               'name_*', 
                               'meta_description_*'
                      ]
               ]
         ]
         filter => [
              'languageCode' => \Yii::$app->locale->languageCode
          ]
      ]
    ]

答案 1 :(得分:0)

此问题似乎是错误,正如github上的其他用户所证实的那样。