首頁 >後端開發 >php教程 >Elasticsearch-PHP api簡介

Elasticsearch-PHP api簡介

不言
不言原創
2018-04-13 09:13:172495瀏覽

這篇文章介紹的內容是關於Elasticsearch-PHP api的簡介,現在分享給大家,有需要的朋友可以參考一下

Elasticsearch 是目前流行的大數據處理框架之一,詳細的說明可以自行百度等.
以下文章採用es縮寫作為代表Elasticsearch

es有官方的php api介面,可以採用github下載或composer.


1.建立索引($client->indices()->create())

      $params = [                'index' => 'user_index',  //索引名(相当于mysql的数据库)
                'body' => [                    'mappings' => [                        'normal_type' => [ //类型名(相当于mysql的表)
                            '_all'=>[   //  是否开启所有字段的检索
                                'enabled' => 'false'
                            ],                            'properties' => [ //文档类型设置(相当于mysql的数据类型)
                                'uid' => [                                    'type' => 'integer' // 字段类型为整型
                                ],                                'username' => [                                    'type' => 'keyword' // 字段类型为关键字,如果需要全文检索,则修改为text,注意keyword字段为整体查询,不能作为模糊搜索
                                ],                                'platform' => [                                    'type' => 'keyword'
                                ],                                'mobile' => [                                    'type' => 'integer'
                                ],                                'sex' => [                                    'type' => 'integer'
                                ],                                'source' => [                                    'type' => 'keyword'
                                ],                                'province' => [                                    'type' => 'keyword'
                                ],                                'city' => [                                    'type' => 'keyword'
                                ],                              'tag' =>   [                                'properties'    =>  [                                    'tagName'   =>[                                        'type' => 'text'
                                    ],                                    'tagWeight'   => [                                        'type' => 'integer',
                                    ]
                                ]
                            ],
                            ]
                        ]
                    ]
                ]
            ];
            $data = $client->indices()->create($params);

簡單的索引就建立完畢了,現在我們可以取得下剛建立的索引資訊.

2.取得索引資訊

2.1 取得索引資訊($client->indices()->getSettings())

     $params = [                'index' => 'user_index',                'client' => [                    'ignore' => 404
                ]
            ];
    $res = $client->indices()->getSettings($params);//获取库索引设置信息

傳回的結果如下:

  array (    'user_index' => 
    array (    'settings' => 
    array (      'index' => 
      array (        'creation_date' => '1498116455327',        'number_of_shards' => '5',        'number_of_replicas' => '1',        'uuid' => '8pkONoI7RAuw5HjnFa4UaQ',        'version' => 
        array (          'created' => '5020299',
        ),        'provided_name' => 'user_index',
        ),
      ),
    ),
 )

2.2 取得Mapping訊息

  • 介面:$client->indices()->getMapping

$params = [                'index' => 'user_index',                'client' => [                    'ignore' => 404
                ]
            ];
$res = $client->indices()->getMapping($params);   //获取mapping信息

返回的結果如下:

array (  'user_index' => 
  array (    'mappings' => 
    array (      'normal_type' => 
      array (        '_all' => 
        array (          'enabled' => false,
        ),        'properties' => 
        array (          'city' => 
          array (            'type' => 'keyword',
          ),          'mobile' => 
          array (            'type' => 'integer',
          ),          'platform' => 
          array (            'type' => 'keyword',
          ),          'province' => 
          array (            'type' => 'keyword',
          ),          'sex' => 
          array (            'type' => 'integer',
          ),          'source' => 
          array (            'type' => 'keyword',
          ),          'uid' => 
          array (            'type' => 'integer',
          ),          'username' => 
          array (            'type' => 'keyword',
          ),
        ),
      ),
    ),
  ),
)

這裡取得的相關資訊就是我們剛剛建立的索引es可以動態的修改以及新增相關的資訊.

2.3 修改/新增mapping資訊

  • #注意事項:已經建立好的欄位類型是不能更改的!!

  • 介面:$client->indices()->putMapping() ;

        $params = [            'index' => 'user_index',  //索引名(相当于mysql的数据库)
            'type'  => 'normal_type',            'body'  =>  [                'normal_type' => [                    'properties'    =>[                        'tag'   =>[                            'type'  => 'text'
                        ]
                    ]
                ]
            ]
        ];
$client->indices()->putMapping($params);

2.4 刪除索引

  • 介面:$client->indices()->delete($params);

        $params = [            'index' => 'user_index',  //索引名(相当于mysql的数据库)
        ];

3 es的增刪改查

3.1 增加資料

  • 單一資料插入

  • #介面:$client->index()

$params = [    'index' => 'my_index',    'type' => 'my_type',    'id' => 'my_id', // 不填则es会自动生成唯一的id
    'body' => [ 'testField' => 'abc']
];
$response = $client->index($params);
  • #批次資料插入

  • ##介面:$ client->bulk();

  •                 foreach($userList as $value){
                        $params['body'][] = [                        'index' => [                            '_index' => 'user_index',                            '_type' => 'normal_type',                            '_id'  =>$value['uid']
                            ]
                        ];
                        $params['body'][] = [                        'uid' => $value['uid'],                        'username' => $value['username'],                        'platform' => $value['platform'],                        'mobile' => $value['mobile'],                        'province' => $value['province'],                        'city' => $value['city'],                        'sex' => $value['gender '],                        'source'=>'xxx'
                        ];
                    }
                    $responses = $client->bulk($params);
  • #ps:當循環插入大量資料時,需要注意php的記憶體超出限制的問題.(還不清楚這個框架哪部分操作之後沒有釋放記憶體)

3.2 搜尋資料

  • 單一資料搜搜,但是需要知道id

  • 介面:$client->get()

  • $params = [    'index' => 'my_index',    'type' => 'my_type',    'id' => 'my_id' // es 自动生成/自己录入的];
    $response = $client->get($params);
  • 批次搜尋

  • 介面:$client->search()

  • $params = [  
        'index' =>  'my_index',   //['my_index1', 'my_index2'],可以通过这种形式进行跨库查询  
        'type' => 'my_type',//['my_type1', 'my_type2'],  
        'body' => [  
            'query' => [  
                'match' => [  // 搜索条件
                    'age' => '24' ,                'tag.tagName' =>'tag'  // 如果字段存储的是object.
                                           //这里搜索必须要这样才能搜索出结果.
                ]  
            ],  
            'from' => '0',  // 分页
            'size' => '200'  // 每页数量
            'sort' => [  // 排序
                'age' => 'desc'   //对age字段进行降序排序  
            ]  
        ]  
    ];  
    $res = $client->search($params);
傳回的資料大致如下:

array (size=4)  'took' => int 2
  'timed_out' => boolean false
  '_shards' => 
    array (size=3)      'total' => int 5
      'successful' => int 5
      'failed' => int 0
  'hits' =>  // 搜索到数据
    array (size=3)      'total' => int 2
      'max_score' => float 1
      'hits' => // 具体数据包
        array (size=1)          0 => 
            array (size=5)
              ...

    ##很多時候需要用到類似mysql的and/or 查詢es搜尋也能做到.
  • 這時候我們就要用到es的組合過濾器
  • https: //www.elastic.co/guide/cn/elasticsearch/guide/current/combining-filters.html 官方文件如下
  • ##以下是測試過的一個例子
  • {    "index": "xxx_index", 
        "type": "normal_type", 
        "body": {        "size": 20, 
            "from": 0, 
            "query": {            "bool": {                "must": [
                        {                        "match": {                            "tag.tagName": "xxxx"
                            }
                        }
                    ]
                }
            }, 
            "sort": {            "uid": "desc"
            }
        }
    }

    3.3 刪除資料

注意:資料刪除的時候有一定的快取更新時間,在沒更新的時候還是能被搜尋出來.
  • 介面:$client->delete();
  • $param = [                'index' => 'my_index',                'type' => 'my_type',                'id'    => 'my_id'
                ];
                $ret = $this->client->delete($param);

    傳回資料如下:
  • array (size=7)  'found' => boolean true
      '_index' => string 'user_index' (length=10)  '_type' => string 'normal_type' (length=11)  '_id' => string 'AVzh_QnIZvcaH3gE7MvE' (length=20)  '_version' => int 2
      'result' => string 'deleted' (length=7)  '_shards' => 
        array (size=3)      'total' => int 2
          'successful' => int 1
          'failed' => int 0
3.4 更新資料

介面:$client->update()
  • $params = [  
        'index' => 'my_index',  
        'type' => 'my_type',  
        'id' => '3416a75f4cea9109507cacd8e2f2aefc',  
        'body' => [  
            'doc' => [  // 必须带上这个.表示是文档操作
                'age' => 150  
            ]  
        ]  
    ];  
    $res = $client->update($params);

    傳回結果
  • array (size=6)  '_index' => string 'user_index' (length=10)  '_type' => string 'normal_type' (length=11)  '_id' => string 'AVzh_QnIZvcaH3gE7Mw5' (length=20)  '_version' => int 2
      'result' => string 'updated' (length=7)  '_shards' => 
        array (size=3)      'total' => int 2
          'successful' => int 1 // 当数据没有发生变化时这里是为0
          'failed' => int 0
4.不同索引之間進行倒數據

注意:不同索引之間倒資料時,需要注意欄位的型別,型別不一樣會導致導入失敗,這個時候可以使用script進行處理
  • #此介面不能再phpapi中運作,作為記錄存在
  • 介面:POST _reindex
  • POST _reindex
    {  "source": {    "index": "user_profile"
      },  "dest": {    "index": "user_prfile_v1"
      },  "script": {    "inline": " ctx._source.tag=params.new_tags",    "params": {      "new_tags":{        "tagName":null,        "tagWeight":0
          }
        }
      }
    }

#作者:湯敏正

連結:
https://www.jianshu.com/p/a2837f487de6

相關推薦:

php呼叫接口api的方法

論vue專案api相關程式碼的組織方式


#

以上是Elasticsearch-PHP api簡介的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn