Yii2 elasticSearch 进行查询

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会进行同义词查询的,速度肯定要慢一些的。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注