您现在的位置是:网站首页>>数据库>>elasticsearch

yii2中使用elasticsearch

发布时间:2018-08-16 11:32:29作者:wangjian浏览量:602点赞量:1

    注意:

    扩展版本2.0.x适用于elasticsearch版本1.0到4.x.

    扩展版本2.1.x至少需要elasticsearch版本5.0。

    拓展:

    2.0.x:composer require yiisoft/yii2-elasticsearch "^2.0"

    2.1.x:composer require yiisoft/yii2-elasticsearch "~2.1.0-dev"

    一.配置部分:

    'elasticsearch' => [
            'class' => 'yii\elasticsearch\Connection',
            'nodes' => [
                ['https_address' => '192.168.0.199:9200'],
                ['https_address' => '192.168.0.210:9200'],
            ],
        ],

    //https_address设置设置的是elasticsearch所设置的集群

    二:使用yii elasticsearch查询数据(这里以安装elasticsearch时创建的text表为例)

    1:使用model形式查询数据

    model:

    <?php
    namespace app\models;
    use yii\elasticsearch\ActiveRecord;
    class EsTest extends ActiveRecord
    {
        // 索引名相当于库名
        public static function index()
        {
            return 'wangjian';
        }
        // 类别名相当于表名
        public static function type()
        {
            return 'test';
        }
        // 属性
        public function attributes()
        {
            $mapConfig = self::mapConfig();
            return array_keys($mapConfig['properties']);
        }
        /**
         *[mapConfig mapping配置]
         *返回这个模型的映射
         */
        public static function mapConfig(){
            return [
                'properties' => [
                    'id'=> ['type' => 'long'],
                    'text'=> ['type' => 'text'],
                    'type'=> ['type' => 'text'],
                ]
            ];
        }
        public static function mapping()
        {
            return [
                static::type() => self::mapConfig(),
            ];
        }
        /**
         * 设置(更新)此模型的映射
         */
        public static function updateMapping(){
            $db = self::getDb();
            $command = $db->createCommand();
            if(!$command->indexExists(self::index())){
                $command->createIndex(self::index());
            }
            $command->setMapping(self::index(), self::type(), self::mapping());
        }
        //获取此模型的映射
        public static function getMapping(){
            $db = self::getDb();
            $command = $db->createCommand();
            return $command->getMapping();
        }
    }

    index()方法,可以看成mysql的db(库名)

    type()可以看成mysql的table(表名),但是实质是有差别的。

    如果你不想要elasticsearch进行分词的话,你可以在mapConfig方法中的每个字段属性后加上"index" => "not_analyzed"

    例:

    public static function mapConfig(){
            return [
                'properties' => [
                    'id'=> ['type' => 'long',"index" => "not_analyzed"],
                    'text'=> ['type' => 'text',"index" => "not_analyzed"],
                    'type'=> ['type' => 'text',"index" => "not_analyzed"],
                ]
            ];
    }

    控制器(进行查询数据)


    <?php
    namespace app\controllers;
    use app\models\EsTest;
    use yii\web\Controller;
    class EsTestController extends Controller
    {
         //查询数据
        public function actionIndex()
        {
           $info = $this->getTableTbody();
            var_dump($info);
        }
       
        public function getTableTbody()
        {
            $pageNum = 1;
            $numPerPage = 50;
            $offset = ($pageNum - 1) * $numPerPage;
            $limit  = $numPerPage ;
            $sort = ['id' => ['order' => 'desc']];  // id 按照desc的方式进行排序
            $query = $this->_getSearchQuery();//调用_getEsarchQuery方法
            $result = $query->orderby($sort)->offset($offset)->limit($limit)->asArray()->all();
            $data = \yii\helpers\BaseArrayHelper::getColumn($result, '_source');
            return $data;
            //通过elasticsearch查询的数据
        }
        public function _getSearchQuery(){
            $query_arr = [
                'bool' => [
                    'must' => [
                        ['term' => ['id' => 1]], //term相当于id等于1
                        // $emails_arr 是数组。
                        ['terms' => ['id' => [1,2,3]]]  // 在查询的字段只有一个值的时候,应该使用term而不是terms,在查询字段包含多个的时候才使用terms terms相当于mysql中的in
                    ]
                ],
            ];
            $filter_arr = [
                  'bool' => [
                      'must' => [
                          ['match' => ['text' => 'elasticsearch']],//实现分词查询,表示查询text字段存在elasticsearch字符串
                      ],
                      'should' => [
                          // 关于wildcard查询可以参看文章(通配符及正则表达式查询):https://blog.csdn.net/dm_vincent/article/details/42024799
                          ['wildcard' => ['text' => "W?F*HW"]]
                      ]
                  ],
              ];
            // ES就是elasticSearch 的 model
            //注意:在yii-elasticsearch2.0中使用filter进行过滤查询,在yii-elstaticsearch2.1中使用postFilter进行过滤查询
            //Query查询器 与 Filter 过滤器,过滤器(filter)通常用于过滤文档的范围,比如某个字段是否属于某个类型,或者是属于哪个时间区间,查询器(query)的使用方法像极了filter,但query更倾向于更准确的查找
            $query = EsTest::find()->postFilter($filter_arr)->query($query_arr);
            return $query;
        }
    }

    2:使用yii\elasticsearch\Query进行数据查询

    <?php
    namespace app\controllers;
    use yii\web\Controller;
    use yii\elasticsearch\Query;
    class EsTestController extends Controller
    {
        public function actionIndex()
        {
            $query_arr = [
                'bool' => [
                    'must' => [
                        ['term' => ['id' => 1]], //term相当于id等于1
                        ['terms' => ['id' => [1,2,3]]]  // 在查询的字段只有一个值的时候,应该使用term而不是terms,在查询字段包含多个的时候才使用terms terms相当于mysql中的in
                    ]
                ],
            ];
            $query = new Query();
            $query->from('wangjian', 'test');  //设置索引目录wangjian 相当于elasticsearch库名,test相当于elasticsearch的表明
            $info = $query->postFilter($query_arr)->search();
        }
    }


上一篇:Yii验证码生成与验证

下一篇:文件上传

1 +1