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

Elasticsearch-PHP api簡介

不言
發布: 2023-03-23 16:18:01
原創
2631 人瀏覽過

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

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

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


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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

$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())

1

2

3

4

$params = [                'index' => 'user_index',                'client' => [                    'ignore' => 404

            ]

        ];

$res = $client->indices()->getSettings($params);//获取库索引设置信息

登入後複製

傳回的結果如下:

1

2

3

4

5

6

7

8

9

10

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

1

2

3

4

$params = [                'index' => 'user_index',                'client' => [                    'ignore' => 404

                ]

            ];

$res = $client->indices()->getMapping($params);   //获取mapping信息

登入後複製

返回的結果如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

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() ;

1

2

3

4

5

6

7

8

        $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);

1

2

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

];

登入後複製

3 es的增刪改查

3.1 增加資料

  • 單一資料插入

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

1

2

3

4

$params = [    'index' => 'my_index',    'type' => 'my_type',    'id' => 'my_id', // 不填则es会自动生成唯一的id

    'body' => [ 'testField' => 'abc']

];

$response = $client->index($params);

登入後複製
  • #批次資料插入

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

  • 1

    2

    3

    4

    5

    6

    7

    8

    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()

  • 1

    2

    $params = [    'index' => 'my_index',    'type' => 'my_type',    'id' => 'my_id' // es 自动生成/自己录入的];

    $response = $client->get($params);

    登入後複製
  • 批次搜尋

  • 介面:$client->search()

  • 1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    $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);

    登入後複製
傳回的資料大致如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

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 官方文件如下
  • ##以下是測試過的一個例子
  • 1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    {    "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();
  • 1

    2

    3

    $param = [                'index' => 'my_index',                'type' => 'my_type',                'id'    => 'my_id'

                ];

                $ret = $this->client->delete($param);

    登入後複製

    傳回資料如下:
  • 1

    2

    3

    4

    5

    6

    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()
  • 1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    $params = [ 

        'index' => 'my_index', 

        'type' => 'my_type', 

        'id' => '3416a75f4cea9109507cacd8e2f2aefc', 

        'body' => [ 

            'doc' => [  // 必须带上这个.表示是文档操作

                'age' => 150 

            

        

    ]; 

    $res = $client->update($params);

    登入後複製

    傳回結果
  • 1

    2

    3

    4

    5

    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
  • 1

    2

    3

    4

    5

    6

    7

    8

    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
作者最新文章
最新問題
java - Spring-data-elasticsearch 怎麼進行認證?
來自於 1970-01-01 08:00:00
0
0
0
關於 mongodb 和 elasticsearch 結合使用
來自於 1970-01-01 08:00:00
0
0
0
重新翻譯為:"PHP語法的ElasticSearch"
來自於 1970-01-01 08:00:00
0
0
0
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板