Yii2 elasticSearch 进行查询

elasticsearch的查询:查询器query 和 过滤器filter

关于查询器query和过滤器filter的区别,可以参看文章:http://www.tuicool.com/articles/7rqAFne

  1. public function getTableTbody()
  2. {
  3. $pageNum = 3;
  4. $numPerPage = 50;
  5. $offset = ($pageNum - 1) * $numPerPage;
  6. $limit = $numPerPage ;
  7. $sort = ['emails' => ['order' => 'desc']]; # emails 按照desc的方式进行排序
  8. $query = $this->_getSearchQuery();
  9. $result = $query->orderby($sort)->offset($offset)->limit($limit)->asArray()->all();
  10. $data = \yii\helpers\BaseArrayHelper::getColumn($result, '_source');
  11. if(!empty($data))
  12. {
  13. foreach($data as $dk => $dr)
  14. {
  15. // do something
  16. }
  17. }
  18. }
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() 方法如下:

  1. public function _getSearchQuery(){
  2. # $field_1 $field_2 都是字段
  3. $filter_arr = [
  4. 'bool' => [
  5. 'must' => [
  6. ['term' => [$field_1 => 'xxxxxxx']]
  7. # $emails_arr 是数组。
  8. ['terms' => [$field_2 => $emails_arr]] # 在查询的字段只有一个值的时候,应该使用term而不是terms,在查询字段包含多个的时候才使用terms
  9. ]
  10. ],
  11. ];
  12. # $field_1 $field_2 都是字段
  13. $query_arr = [
  14. 'bool' => [
  15. 'must' => [
  16. ['match' => [$field_1 => 'xxxxx']],
  17. ],
  18. 'should' => [
  19. # 关于wildcard查询可以参看文章:http://blog.csdn.net/dm_vincent/article/details/42024799
  20. ['wildcard' => [$field_2 => "W?F*HW"]]
  21. ]
  22. ],
  23. ];
  24. # Customer 就是elasticSearch 的 model
  25. $query = Customer::find()->filter($filter_arr)->query($query_arr);
  26. return $query;
  27. }
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会进行同义词查询的,速度肯定要慢一些的。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

发表评论

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