专栏首页热爱ITPHP Elasticsearch的基本使用方法

PHP Elasticsearch的基本使用方法

对于Elasticsearch与Elasticsearch-php的安装,网上有比较多的教程,这里不再累述。只是要注意Elasticsearch、Elasticsearch-php与php的版本。这里笔者使用的是Elasticsearch 5.6.8 windows版、php 5.6 、php onethink框架(以下简称ot)、Elasticsearch-php composer如下:(PHP Composer 视频教程

1 2 3 4 5

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

一、连接Elasticsearch:

1、Elasticsearch开启之后,可以直接通过http://127.0.0.1:9200/查看基本信息。

2、将composer vendor下的文件复制到ot ThinkPHP\Library\Vendor\elasticsearch目录下。

3、连接Elasticsearch,

1 2 3 4 5 6 7 8 9 10 11 12 13 14

public $es;   /**  * 初始化  */ public function _initialize() {     Vendor('elasticsearch.autoload');     //host数组可配置多个节点     $params = array(         '127.0.0.1:9200'     );     $this->es = \Elasticsearch\ClientBuilder::create()->setHosts($params)->build(); }

其中build()方法会将ClientBuilder 对象转换为一个Client对象。

二、Elasticsearch-php使用:

1、创建index:

关于index与type,这里特别纠正一个说法,index 就像关系型数据库里的 database, type 就像 database 里的 table,这种理解是错误的。

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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

/**  * 创建索引  */ public function createIndex(){     $params = [         'index' => 'test', //索引名称         'body' => [             'settings'=> [ //配置                 'number_of_shards'=> 3,//主分片数                 'number_of_replicas'=> 1 //主分片的副本数             ],             'mappings'=> [  //映射                 '_default_' => [ //默认配置,每个类型缺省的配置使用默认配置                     '_all'=>[   //  关闭所有字段的检索                         'enabled' => 'false'                     ],                     '_source'=>[   //  存储原始文档                         'enabled' => 'true'                     ],                     'properties'=> [ //配置数据结构与类型                         'name'=> [ //字段1                             'type'=>'string',//类型 string、integer、float、double、boolean、date                             'index'=> 'analyzed',//索引是否精确值  analyzed not_analyzed                         ],                         'age'=> [ //字段2                             'type'=>'integer',                         ],                         'sex'=> [ //字段3                             'type'=>'string',                             'index'=> 'not_analyzed',                         ],                     ]                 ],                 'my_type' => [                     'properties' => [                         'phone'=> [                             'type'=>'string',                         ],                                                ]                 ],             ],         ]     ];       $res = $this->es->indices()->create($params); }

在使用Elasticsearch-php API的时候,参数$params一般是用数组来,因为数组结构能很方便的转换为json。其中

_default_是默认配置,其他配置的缺省值都与_default_的相同。

_all设置true会将所有原始文档拼接在一起额外存储,

_source设置为true会存储原始文档,设置false一般用在只需要索引出文档的标题或者Url,通过Url去访问文档,而不需要在es中保存一份文档内容的场景。

最后,注意同一index下不同type中的同名称字段的数据类型与配置也必须相同!

2、删除index:

1 2 3 4 5 6 7 8 9 10

/**  * 删除索引  */  public function deleteIndex(){     $params = [         'index' => 'test'     ];       $res = $this->es->indices()->delete($params);  }

3、查看Mappings:

1 2 3 4 5 6 7

public function getMappings(){     $params = [         'index' => 'test'     ];       $res = $this->es->indices()->getMapping($params); }

4、修改Mappings:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

public function putMappings(){     $params = [                   'index' => 'test',         'type' => 'my_type',         'body' => [             'my_type' => [                 'properties' => [                     'idcard' => [                         'type' => 'integer'                     ]                 ]             ]         ]     ];       $res = $this->es->indices()->putMapping($params);      }

注意:修改Mappings的API必须要指明type,且只能添加,不能修改已有的属性。

5、插入单条 Document:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

public function postSinDoc(){     $params = [         'index' => 'test',         'type' => 'my_type',         'body' => [             'age' => 17,             'name' => 'saki',             'sex' => '女性',             'idcard' => 1112,             'phone' => '1245789',         ]     ];       $res = $this->es->index($params); }

6、插入多条 Document:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

public function postBulkDoc(){     for($i = 0; $i < 5; $i++) {         $params['body'][] = [             'index' => [                 '_index' => 'test',                 '_type' => 'my_type',             ]         ];           $params['body'][] = [             'age' => 17+$i,             'name' => 'reimu'.$i,             'sex' => '女性',             'idcard' => 1112+$i,             'phone' => '1245789'.$i,         ];     }       $res = $this->es->bulk($params); }

7、通过id获取Document:

1 2 3 4 5 6 7 8 9

public function getDocById(){     $params = [         'index' => 'test',         'type' => 'my_type',         'id' => 'AWIDV5l2A907wJBVKu6k'     ];       $res = $this->es->get($params); }

8、通过id更新Document:

1 2 3 4 5 6 7 8 9 10 11 12 13 14

public function updateDocById(){     $params = [         'index' => 'test',         'type' => 'my_type',         'id' => 'AWIDV5l2A907wJBVKu6k',         'body' => [             'doc' => [ //将doc中的文档与现有文档合并                 'name' => 'marisa'             ]         ]     ];       $res = $this->es->update($params); }

9、通过id删除Document:

1 2 3 4 5 6 7 8 9

public function deleteDocById(){     $params = [         'index' => 'test',         'type' => 'my_type',         'id' => 'AWIDV5l2A907wJBVKu6k'     ];       $res = $this->es->delete($params); }

注意:以上通过id的三个操作,如果未找到id,Elasticsearch-php会直接报错!

10、搜索Document:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

public function searchDoc(){     $params = [         'index' => 'test',         'type' => 'my_type',         'body' => [             'query' => [                 'constant_score' => [ //非评分模式执行                     'filter' => [ //过滤器,不会计算相关度,速度快                         'term' => [ //精确查找,不支持多个条件                             'name' => 'reimu0'                         ]                     ]                                       ]             ]         ]     ];       $res = $this->es->search($params);

这里只是搜索的一个示例。

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PHP中使用Elasticsearch 转

    会自动加载合适的版本!我的php是5.6的,它会自动加载5.3的elasticsearch版本!

    双面人
  • PHP 使用 ElasticSearch 做搜索

    lasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearc...

    双面人
  • php将多个值的数组去除重复元素 转

    (adsbygoogle = window.adsbygoogle || []).push({});

    双面人
  • 详解百度echarts如何自定义地图板块,实现鼠标交互效果

    声明:理工科的同志,语言组织能力差,轻喷 先吐槽一下,自从大数据流行起来过后,做开发的很多朋友都遇到了一个调侃的问题:为什么你们都那么喜欢研究地球。我只能说,没...

    企鹅号小编
  • javascript jquery ajax动态提交多个参数 api测试

    用户1258909
  • Elasticsearch的Index和Mapping(二)

    本文使用的Elasticsearch版本为6.5.4,基本命令以及操作大都通用。下面通过MySQL与Elasticsearch的对比图,让我们更好地理解接下来的...

    用户3467126
  • Python|GUI编程的基础讲解

    学python的各位可能对于python只能在终端里输入输出感觉有些无聊吧!其实在python GUI编程(图形用户界面编程)里可以实现将程序窗口化,可以引入t...

    算法与编程之美
  • 「走进k8s」Docker三剑客之Docker Compose(七)

    --force-rm 删除构建过程中的临时容器。--no-cache 构建镜像过程中不使用 cache(这将加长构建过程) 。--pull 始终尝试通过 pul...

    IT故事会
  • 3.1 Contour绘制

    首先一起学习利用百度的开源项目绘制contour,百度搜索“echarts heatmap”,找到热力图的一个案例(http://echarts.baidu.c...

    周星星9527
  • 两个input标签之间间隙问题的解决

    IT人一直在路上

扫码关注云+社区

领取腾讯云代金券