我将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
。如果两个部件中的一个被移除,则另一个过滤器完美地工作,而不是一起。
有什么想法吗?
答案 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上的其他用户所证实的那样。