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 視頻教程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);

這裏只是搜索的一個示例。

相關文章
相關標籤/搜索