Elasticsearch-PHP api簡介

來源:互聯網
上載者:User
這篇文章介紹的內容是關於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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.