對於Elasticsearch與Elasticsearch-php的安裝,網上有比較多的教程,這裏再也不累述。只是要注意Elasticsearch、Elasticsearch-php與php的版本。這裏筆者使用的是Elasticsearch 5.6.8 windows版、php 5.6 、php onethink框架(如下簡稱ot)、Elasticsearch-php composer以下:(PHP Composer 視頻教程)php
1html 2linux 3數據庫 4json 5windows |
{ 數組 "require" :{ 數據結構 "elasticsearch/elasticsearch" : "~5.0" app } composer } |
1、鏈接Elasticsearch:
一、Elasticsearch開啓以後,能夠直接經過http://127.0.0.1:9200/查看基本信息。
二、將composer vendor下的文件複製到ot ThinkPHP\Library\Vendor\elasticsearch目錄下。
三、鏈接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對象。
2、Elasticsearch-php使用:
一、建立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中的同名稱字段的數據類型與配置也必須相同!
二、刪除index:
1 2 3 4 5 6 7 8 9 10 |
/** * 刪除索引 */ public function deleteIndex(){ $params = [ 'index' => 'test' ]; $res = $this ->es->indices()-> delete ( $params ); } |
三、查看Mappings:
1 2 3 4 5 6 7 |
public function getMappings(){ $params = [ 'index' => 'test' ]; $res = $this ->es->indices()->getMapping( $params ); } |
四、修改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,且只能添加,不能修改已有的屬性。
五、插入單條 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 ); } |
六、插入多條 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 ); } |
七、經過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 ); } |
八、經過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 ); } |
九、經過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會直接報錯!
十、搜索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 ); |
這裏只是搜索的一個示例。