對於Elasticsearch與Elasticsearch-php的安裝,網路上有比較多的教程,這裡不再累述。只是要注意Elasticsearch、Elasticsearch-php與php的版本。這裡筆者使用的是Elasticsearch 5.6.8 windows版、php 5.6 、php onethink框架(以下簡稱ot)、Elasticsearch-php composer如下:(PHP Composer 影片教學)
{ "require":{ "elasticsearch/elasticsearch" : "~5.0" } }
課程推薦→:《elasticsearch全文搜尋實戰》(實戰影片)
一、連接Elasticsearch:
1、Elasticsearch開啟之後,可以直接透過http://127.0.0.1:9200 /查看基本資訊。
2、將composer vendor下的檔案複製到ot ThinkPHP\Library\Vendor\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物件。
二、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 < 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:
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 能夠被用在什麼地方?
以上是PHP Elasticsearch的基本使用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!