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)
              ...
{
    "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
      }
    }
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容