• Elasticsearch全文搜索引擎-PHP使用教程


    1、声明依赖关系:

            比方说,你的项目中需要一个php版的elasticsearch框架。为了将它添加到你的项目中(下载),你所需要做的就是创建一个 composer.json 文件,其中描述了项目的依赖关系。注意文件要放在你执行composer命令的目录中

    {
        "require":{
            "elasticsearch/elasticsearch":"~2.0"
        }
    }

    2、cmd切换到要下载elasticsearch框架的目录,然后执行命令:composer install

         如有出错误信息:

          [ComposerDownloaderTransportException]

          Content-Length mismatch, received 583439 bytes out of the expected 1215108

         解决办法:切换国内镜像地址,再执行操作

          1、通过命令切换如下:(最终修改的是composer.json)

          composer config -g repo.packagist composer https://packagist.phpcomposer.com

          2、直接修改 composer.json (其实跟方法1是一样的。)

    {
        "require":{
            "elasticsearch/elasticsearch":"~2.0"
        },
        "repositories": {
            "packagist": {
                "type": "composer",
                "url": "https://packagist.phpcomposer.com"
            }
        }
    }

       

     

    PHP使用elasticsearch教程

    想直接通过文件查看其他方法可以打开以下文件查看(基本使用的方法都在里面):

    1、elasticsearchsrcElasticsearchClient.php中的方法

    2、elasticsearchNamespacesIndicesNamespace.php中的方法

    ThinkPHP中的模型(已测试过):

    <?php
    /**
     * Elasticsearch检索引擎模型
     */
    namespace appindexmodel;
    use ElasticsearchClientBuilder;  
       
    class Elasticsearch
    {
        //配置
        private $config = [
            'hosts' => ['http://127.0.0.1:9200']
        ];
        private $api;
        public function __construct()
        {
            #include(APP_PATH .'/vendor/autoload.php');
            #require_once EXTEND_PATH . 'org/elasticsearch/autoload.php';
            import('org.elasticsearch.autoload', EXTEND_PATH);
            $this->api = ClientBuilder::create()->setHosts($this->config['hosts'])->build(); 
        }
     
        /*************************************************************
        /**
         * 索引一个文档
         * 说明:索引没有被创建时会自动创建索引
         */
        public function addOne()
        {
            $params = [];  
            $params['index'] = 'xiaochuan';  
            $params['type']  = 'cat';  
            $params['id']  = '20180407001';  # 不指定就是es自动分配
            $params['body']  = array('name' => '小川编程');  
            return $this->api->index($params);
        }
     
        /**
         * 索引多个文档
         * 说明:索引没有被创建时会自动创建索引
         */
        public function addAll()
        {
            $params = [];
            for($i = 1; $i < 21; $i++) {  
                $params['body'][] = [
                    'index' => [
                        '_index' => 'test_index'.$i,
                        '_type'  => 'cat_test',
                        '_id'    => $i,
                    ]
                ];  
                $params['body'][] = [  
                    'name' => '小川编程'.$i,  
                    'content' => '内容'.$i  
                ];
            }  
            return $this->api->bulk($params);  
        }
     
        /**
         * 获取一个文档
         */
        public function getOne()
        {
            $params = [];  
            $params['index'] = 'xiaochuan';  
            $params['type']  = 'cat';  
            $params['id']    = '20180407001';  
            return $this->api->get($params); 
        }
     
        /**
         * 搜索文档
         */
        public function search()
        {
            $params = [];
            $params['index'] = 'xiaochuan';  
            $params['type']  = 'cat';  
            $params['body']['query']['match']['name'] = '小川编程';  
            return $this->api->search($params); 
        }
     
        /**
         * 删除文档
         * 说明:文档删除后,不会删除对应索引。
         */
        public function delete()
        {
            $params = [];  
            $params['index'] = 'xiaochuan';  
            $params['type'] = 'cat';  
            $params['id'] = '20180407001';  
            return $this->api->delete($params);  
        }
     
        /*************************************************************
        /**
         * 创建索引
         */
        public function createIndex()
        {
            $params = [];
            $params['index']  = 'xiaochuan'; 
            return $this->api->indices()->create($params);  
        }
           
          /**
         * 删除索引:匹配单个 | 匹配多个
         * 说明: 索引删除后,索引下的所有文档也会被删除
         */
          public function deleteIndex()
          {  
              $params = [];
              $params['index'] = 'test_index';  # 删除test_index单个索引
              #$params['index'] = 'test_index*'; # 删除以test_index开始的所有索引
            return $this->api->indices()->delete($params);  
          }
     
          /*************************************************************
          /**
         * 设置索引配置
         */
          public function setIndexConfig()
          {  
              $params = [];
              $params['index'] = 'xiaochuan';  
            $params['body']['index']['number_of_replicas'] = 0;  
            $params['body']['index']['refresh_interval'] = -1;  
            return $this->api->indices()->putSettings($params);  
          }
     
          /**
         * 获取索引配置
         */
          public function getIndexConfig()
          {
              # 单个获取条件写法
            $params['index'] = 'xiaochuan';  
            # 多个获取条件写法
            //$params['index'] = ['xiaochuan', 'test_index'];  
            return $this->api->indices()->getSettings($params);  
          }
     
        /**
         * 设置索引映射
         */
          public function setIndexMapping()
          {
              #  设置索引和类型 
            $params['index'] = 'xiaochuan';  
            $params['type']  = 'cat';  
               
            #  向现有索引添加新类型
            $myTypeMapping = array(  
                '_source' => array(  
                    'enabled' => true  
                ),  
                'properties' => array(  
                    'first_name' => array(  
                        'type' => 'string',  
                        'analyzer' => 'standard'  
                    ),  
                    'age' => array(  
                        'type' => 'integer'  
                    )  
                )  
            );  
            $params['body']['cat'] = $myTypeMapping;  
               
            #  更新索引映射 
            $this->api->indices()->putMapping($params);  
          }
     
          /**
         * 获取索引映射
         */
          public function getIndexMapping()
          {  
              #  获取所有索引和类型的映射  
            $ret = $this->api->indices()->getMapping();  
             
            /*  
            #  获取索引为:xiaochuan的映射
            $params['index'] = 'xiaochuan';  
            $ret = $this->api->indices()->getMapping($params);  
               
            #  获取类型为:cat的映射
            $params['type'] = 'cat';  
            $ret = $this->api->indices()->getMapping($params);  
               
            #  获取(索引为:xiaochuan和 类型为:cat)的映射
            $params['index'] = 'xiaochuan';  
            $params['type']  = 'cat'  
            $ret = $this->api->indices()->getMapping($params);  
               
            #  获取索引为:xiaochuan和test_index的映射
            $params['index'] = ['xiaochuan', 'test_index'];  
            $ret = $this->api->indices()->getMapping($params); 
            */
     
            return $ret;
          }
    }

    其他形式用法测试:

    test.php

    <?php   
    require_once('vendor/autoload.php');  
    use ElasticsearchClientBuilder;  
       
       
    function get_conn(){  
        $host = 'localhost';  
        $dbname = 'mraz';  
        $user = 'root';  
        $passwd = '111111';  
       
       
        $conn = new PDO("mysql:dbname=$dbname;host=$host",$user,$passwd);  
        return $conn;  
    }  
       
       
    function create_index(){  
        //Elastic search php client  
       
       
       
       
        $client = ElasticsearchClientBuilder::create()->build();  
        $sql    = "SELECT * FROM emp";  
        $conn   = get_conn();  
        $stmt   = $conn->query($sql);  
        $rtn    = $stmt->fetchAll();  
       
       
        //delete index which already created  
        $params = array();  
        $params['index'] = 'emp_index';  
        $client->indices()->delete($params);  
           
        //create index on log_date,src_ip,dest_ip  
        $rtnCount = count($rtn);  
        for($i=0;$i<$rtnCount;$i++){  
            $params = array();  
            $params['body'] = array(  
                'id'       => $rtn[$i]['id'],  
                'fdName'   => $rtn[$i]['fdName'],  
                'fdAge'    => $rtn[$i]['fdAge'],  
                'fdStatus' => $rtn[$i]['fdStatus']  
            );  
            $params['index'] = 'emp_index';  
            $params['type']  = 'emp_type';  
               
            //Document will be indexed to log_index/log_type/autogenerate_id          
            $client->index($params);  
        }  
        echo 'create index done!';  
    }  
       
       
    function search(){  
        //Elastic search php client  
        $client = ElasticsearchClientBuilder::create()->build();  
        $params = array();  
        $params['index'] = 'emp_index';  
        $params['type'] = 'emp_type';  
        $params['body']['query']['match']['fdStatus'] = '1';  
        $params['body']['sort'] = array('fdAge'=>array('order'=>'desc'));  
        $params['size'] = 3;    
        $params['from'] = 1;    
        $rtn = $client->search($params);  
        var_dump($rtn);  
    }  
    set_time_limit(0);  
    // create_index();  
    search();  
    ?>

    1)创建:

    include('./vendor/autoload.php');  
    $elastic = new ElasticsearchClient();  
    $index['index'] = 'log';  //索引名称  
    $index['type'] = 'ems_run_log'; //类型名称  
    $data['body']['settings']['number_of_shards'] = 5;  //主分片数量  
    $data['body']['settings']['number_of_replicas'] = 0; //从分片数量  
    $elastic->indices()->create($index);

    2)插入索引数据:

    include('./vendor/autoload.php');  
    $elastic = new ElasticsearchClient();  
    $index['index'] = 'log'; //索引名称  
    $index['type'] = 'ems_run_log'; //类型名称  
    $index['id'] = 1   //不指定id,系统会自动生成唯一id  
    $index['body'] = array(  
      'mac' => 'fcd5d900beca',  
      'customer_id' => 3,  
      'product_id' => 5,  
      'version' => 2  
    );  
    $elastic->index($index);

    3)查询:

    include('./vendor/autoload.php');  
    $elastic = new ElasticsearchClient();  
    $index['index'] = 'log'; //索引名称  
    $index['type'] = 'ems_run_log'; //类型名称  
    $index['body']['query']['match']['mac'] = 'fcd5d900beca';  
    $index['size'] = 10;  
    $index['from'] = 200;  
    $elastic->search($index);  
     
    #相当于sql语句:select*from ems_run_log where mac='fcd5d900beca' limit 200,10;
    include('./vendor/autoload.php');  
    $elastic = new ElasticsearchClient();  
    $index['index'] = 'log'; //索引名称  
    $index['type'] = 'ems_run_log'; //类型名称  
    $index['body']['query']['bool']['must'] = array(  
        array('match' => array('mac' => 'fcd5d900beca')),  
        array('match' => array('product_id' => 20))  
       );  
    $index['size'] = 10;  
    $index['from'] = 200;  
    $elastic->search($index);  
     
    #相当于sql语句:select*from ems_run_log where mac='fcd5d900beca' and product_id=20 limit 200,10;
    include('./vendor/autoload.php');  
    $elastic = new ElasticsearchClient();  
    $index['index'] = 'log'; //索引名称  
    $index['type'] = 'ems_run_log'; //类型名称  
    $index['body']['query']['bool']['should'] = array(  
          array('match' => array('mac' => 'fcd5d900beca')),  
          array('match' => array('product_id' => 20))  
         );  
    $index['size'] = 10;  
    $index['from'] = 200;  
    $elastic->search($index);  
     
    #当于sql语句:select*from ems_run_log where mac='fcd5d900beca' or product_id=20 limit 200,10;
    include('./vendor/autoload.php');  
    $elastic = new ElasticsearchClient();  
    $index['index'] = 'log'; //索引名称  
    $index['type'] = 'ems_run_log'; //类型名称  
    $index['body']['query']['bool']['must_not'] = array(  
       array('match' => array('mac' => 'fcd5d900beca')),  
       array('match' => array('product_id' => 20))  
      );  
    $index['size'] = 10;  
    $index['from'] = 200;  
    $elastic->search($index);  
     
    #相当于sql语句:select*from ems_run_log where mac!='fcd5d900beca' and product_id!=20 limit 200,10;
    include('./vendor/autoload.php');  
    $elastic = new ElasticsearchClient();  
    $index['index'] = 'log'; //索引名称  
    $index['type'] = 'ems_run_log'; //类型名称  
    $index['body']['query']['range'] = array(  
       'id' => array('gte' => 20,'lt' => 30);  
     );  
    $index['size'] = 10;  
    $index['from'] = 200;  
    $elastic->search($index);  
     
    #相当于sql语句:select*from ems_run_log where id>=20 and id<30  limit 200,10;

    4)删除文档:

    include('./vendor/autoload.php');  
    $elastic = new ElasticsearchClient();  
    $index['index'] = 'test';  //索引名称  
    $index['type'] = 'ems_test'; //类型名称  
    $index['id'] = 2;   
    $elastic->delete($index);
    include('./vendor/autoload.php');  
    $elastic = new ElasticsearchClient();  
    $index['index'] = 'log'; //索引名称  
    $index['type'] = 'ems_run_log'; //类型名称  
    $index['body']['query']['bool']['must_not'] = array(  
       array('match' => array('mac' => 'fcd5d900beca')),  
       array('match' => array('product_id' => 20))  
      );  
    $index['size'] = 10;  
    $index['from'] = 200;  
    $elastic->search($index);  
     
    #相当于sql语句:select*from ems_run_log where mac!='fcd5d900beca' and product_id!=20 limit 200,10;
    include('./vendor/autoload.php');  
    $elastic = new ElasticsearchClient();  
    $index['index'] = 'log'; //索引名称  
    $index['type'] = 'ems_run_log'; //类型名称  
    $index['body']['query']['range'] = array(  
       'id' => array('gte' => 20,'lt' => 30);  
     );  
    $index['size'] = 10;  
    $index['from'] = 200;  
    $elastic->search($index);  
     
    #相当于sql语句:select*from ems_run_log where id>=20 and id<30  limit 200,10;

    4)删除文档:

    include('./vendor/autoload.php');  
    $elastic = new ElasticsearchClient();  
    $index['index'] = 'test';  //索引名称  
    $index['type'] = 'ems_test'; //类型名称  
    $index['id'] = 2;   
    $elastic->delete($index);
  • 相关阅读:
    堆和栈 的区别
    equals == 区别
    【知识点】Filter、Servlet、Listener区别与联系
    白盒测试相关的一些知识
    紧急情况下压缩了测试周期应该怎么办?
    软件性能测试与可靠性测试
    软件测试概念
    web测试方法总结
    结对测试探讨
    八种状态增加测试用例状态的精确度
  • 原文地址:https://www.cnblogs.com/mzhaox/p/11210025.html
Copyright © 2020-2023  润新知