elasticsearch的查询:查询器query 和 过滤器filter
关于查询器query和过滤器filter的区别,可以参看文章:http://www.tuicool.com/articles/7rqAFne
public function getTableTbody() { $pageNum = 3; $numPerPage = 50; $offset = ($pageNum - 1) * $numPerPage; $limit = $numPerPage ; $sort = ['emails' => ['order' => 'desc']]; # emails 按照desc的方式进行排序 $query = $this->_getSearchQuery(); $result = $query->orderby($sort)->offset($offset)->limit($limit)->asArray()->all(); $data = \yii\helpers\BaseArrayHelper::getColumn($result, '_source'); if(!empty($data)) { foreach($data as $dk => $dr) { // do something } } }
上面使用的_getSearchQuery() 方法如下:
public function _getSearchQuery(){ # $field_1 $field_2 都是字段 $filter_arr = [ 'bool' => [ 'must' => [ ['term' => [$field_1 => 'xxxxxxx']] # $emails_arr 是数组。 ['terms' => [$field_2 => $emails_arr]] # 在查询的字段只有一个值的时候,应该使用term而不是terms,在查询字段包含多个的时候才使用terms ] ], ]; # $field_1 $field_2 都是字段 $query_arr = [ 'bool' => [ 'must' => [ ['match' => [$field_1 => 'xxxxx']], ], 'should' => [ # 关于wildcard查询可以参看文章:http://blog.csdn.net/dm_vincent/article/details/42024799 ['wildcard' => [$field_2 => "W?F*HW"]] ] ], ]; # Customer 就是elasticSearch 的 model $query = Customer::find()->filter($filter_arr)->query($query_arr); return $query; }
对于上面出现的must should,自己查资料,了解elasticSearch
对于term 相当于等于
对于terms相当于mysql中的in
在上述查询中,filter是不分词,不进行同义词查询的,速度肯定要快
query会进行同义词查询的,速度肯定要慢一些的。