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

一、聲明依賴關係:

        比方說,你的項目中須要一個php版的elasticsearch框架。爲了將它添加到你的項目中(下載),你所須要作的就是建立一個 composer.json 文件,其中描述了項目的依賴關係。注意文件要放在你執行composer命令的目錄中php

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

二、cmd切換到要下載elasticsearch框架的目錄,而後執行命令:composer installmysql

     若有出錯誤信息:sql

      [Composer\Downloader\TransportException]編程

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

     解決辦法:切換國內鏡像地址,再執行操做api

      一、經過命令切換以下:(最終修改的是composer.json)app

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

      二、直接修改 composer.json (其實跟方法1是同樣的。)框架

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

   

 

PHP使用elasticsearch教程

想直接經過文件查看其餘方法能夠打開如下文件查看(基本使用的方法都在裏面):elasticsearch

一、\elasticsearch\src\Elasticsearch\Client.php中的方法

二、\elasticsearch\Namespaces\IndicesNamespace.php中的方法

ThinkPHP中的模型(已測試過):

<?php
/**
 * Elasticsearch檢索引擎模型
 */
namespace app\index\model;
use Elasticsearch\ClientBuilder;  
   
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 Elasticsearch\ClientBuilder;  
   
   
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 = Elasticsearch\ClientBuilder::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 = Elasticsearch\ClientBuilder::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 Elasticsearch\Client();  
$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 Elasticsearch\Client();  
$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 Elasticsearch\Client();  
$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 Elasticsearch\Client();  
$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 Elasticsearch\Client();  
$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 Elasticsearch\Client();  
$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 Elasticsearch\Client();  
$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 Elasticsearch\Client();  
$index['index'] = 'test';  //索引名稱  
$index['type'] = 'ems_test'; //類型名稱  
$index['id'] = 2;   
$elastic->delete($index);
include('./vendor/autoload.php');  
$elastic = new Elasticsearch\Client();  
$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 Elasticsearch\Client();  
$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 Elasticsearch\Client();  
$index['index'] = 'test';  //索引名稱  
$index['type'] = 'ems_test'; //類型名稱  
$index['id'] = 2;   
$elastic->delete($index);
相關文章
相關標籤/搜索