0

我将我的 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独立于序列。如果两个部分中的一个被移除,另一个过滤器可以完美地工作,只是不能一起使用。任何想法?

4

2 回答 2

0

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

于 2018-06-12T09:22:07.190 回答
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
          ]
      ]
    ]
于 2018-02-16T09:59:49.640 回答