{ "require":{ "elasticsearch/elasticsearch" : "~5.0" } }
A、连接Elasticsearch:
3、连接Elasticsearch,
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对象。
B、Elasticsearch-php使用:
1、创建index:
关于index与type,这里特别纠正一个说法,index 就像关系型数据库里的 database, type 就像 database 里的 table,这种理解是错误的。
/** * 创建索引 */ 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:
/** * 删除索引 */ public function deleteIndex(){ $params = [ 'index' => 'test' ]; $res = $this->es->indices()->delete($params); }
3、查看Mappings:
public function getMappings(){ $params = [ 'index' => 'test' ]; $res = $this->es->indices()->getMapping($params); }
4、修改Mappings:
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:
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:
public function postBulkDoc(){ for($i = 0; $i [ '_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:
public function getDocById(){ $params = [ 'index' => 'test', 'type' => 'my_type', 'id' => 'AWIDV5l2A907wJBVKu6k' ]; $res = $this->es->get($params); }
8、通过id更新Document:
public function updateDocById(){ $params = [ 'index' => 'test', 'type' => 'my_type', 'id' => 'AWIDV5l2A907wJBVKu6k', 'body' => ['doc' => [ //将doc中的文档与现有文档合并 'name' => 'marisa'] ] ]; $res = $this->es->update($params); }
9、通过id删除Document:
public function deleteDocById(){ $params = [ 'index' => 'test', 'type' => 'my_type', 'id' => 'AWIDV5l2A907wJBVKu6k' ]; $res = $this->es->delete($params); }
注意:以上通过id的三个操作,如果未找到id,Elasticsearch-php会直接报错!
10、搜索Document:
public function searchDoc(){ $params = [ 'index' => 'test', 'type' => 'my_type', 'body' => ['query' => [ 'constant_score' => [ //非评分模式执行 'filter' => [ //过滤器,不会计算相关度,速度快 'term' => [ //精确查找,不支持多个条件'name' => 'reimu0' ] ] ]] ] ]; $res = $this->es->search($params);
这里只是搜索的一个示例。
实例详解MySQL 与 Elasticsearch 数据不对称问题
Elasticsearch是什么?Elasticsearch 能够被用在什么地方?
Elasticsearch索引和文档操作实例教学