elasticsearch-php结合ik分词,实现中文检索

作者: 白云飞 分类: elasticSearch,php 发布时间: 2018-12-20 23:36 阅读:

上一篇,《elasticSearch 6.5中文检索分词 ik分词插件》我们介绍了,如何搭建 elasticSearch + ik 分词的中文分词搜索的环境,接下来,我们结合 elasticsearch-php 即 elasticSearch 的php的客户端,完成索引的建立,文档的索引,以及查询。

elasticSearch的官网,有php客户端的手册,只是版本还是有一点老了,有些东西在 6.5.3 上已经无法使用了。不过很好修改。手册地址是:https://www.elastic.co/guide/cn/elasticsearch/php/current/_installation_2.html。

首先,我们找一个 目录,以我自己的为例子 elasticsearch 目录,然后执行

composer require elasticsearch/elasticsearch

此时,就可以将 elasticsearch-php,拉到目录中。

接下来,就是通过 elasticsearch-php 客户端,连接 elasticSearch 服务器。

<?php

use Elasticsearch\ClientBuilder;

require './vendor/autoload.php';

$hosts = [
    '127.0.0.1:9200'
];

$client = ClientBuilder::create()->setHosts($hosts)->build();

其中 hosts 有好几种写法。

$hosts = [
    '192.168.1.1:9200',         // IP + Port
    '192.168.1.2',              // Just IP
    'mydomain.server.com:9201', // Domain + Port
    'mydomain2.server.com',     // Just Domain
    'https://localhost',        // SSL to localhost
    'https://192.168.1.3:9200'  // SSL to IP + Port
];

手册中有讲,具体的细节,可以去查阅相关的资料,我这里,就只采用 ip + port 的方式。建立了连接之后,我们就可以创立一个索引,什么叫索引呢?其实你可以把他理解成,数据库中的一张表。

<?php

use Elasticsearch\ClientBuilder;

require './vendor/autoload.php';

$hosts = [
    '127.0.0.1:9200'
];

$client = ClientBuilder::create()->setHosts($hosts)->build();

$params = [
    'index' => 'my_index'
];

$response = $client->indices()->create($params);

此时就建立了一个,叫 my_index 的索引。至于索引怎么删除,怎么修改,这里你可以查看手册,里面都有详细的介绍。我这里不加以赘述了 https://www.elastic.co/guide/cn/elasticsearch/php/current/_index_management_operations.html

我们现在建立的索引,相当于一张空表,里面一个字段都没有,几乎没什么实际的价值。在我们建立索引的通知,可以添加 mappings选项,相当于 在表中建立了 字段。

<?php

use Elasticsearch\ClientBuilder;

require './vendor/autoload.php';

$hosts = [
    '127.0.0.1:9200'
];

$client = ClientBuilder::create()->setHosts($hosts)->build();

$params = [
    'index' => 'my_index',
    'body' => [
        'mappings' => [
            'my_type' => [
                'properties' => [
                    'first_name' => [
                        'type' => 'text',
                        'analyzer' => 'ik_max_word'
                    ],
                    'age' => [
                        'type' => 'integer'
                    ]
                ]
            ]
        ]
    ]
];

$response = $client->indices()->create($params);
echo "<pre>";
print_r($response);

my_type 是 my_index 索引的类型名

properties 代表 该类型中的属性

first_name 你可以理解为数据库中的表中的字段。type 是类型。6.5 中没有 string 这个类型了,统一叫 text。 analyzer 标识分析器,这里我们采用 我们下载的 ik 中的 ik_max_word。

  • IK分词支持两种分析器Analyzer: ik_smart , ik_max_word , 两种分词器Tokenizer: ik_smart , ik_max_word,
  • ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;
  • ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。

访问这个文件,看到如下的画面:

Array
(
    [acknowledged] => 1
    [shards_acknowledged] => 1
    [index] => my_index
)

表示,名为my_index 的索引建立成功。接下来,我们来索引一个文档。

// 索引文档
$params = [
    'index' => 'my_index',
    'type' => 'my_type',
    'id' => 1,
    'body' => [
        'first_name' => '我的名字叫小王',
        'age' => 22
    ]
];

$response = $client->index($params);
echo "<pre>";
print_r($response);

 index 就是刚才我们创建的索引名称 my_index

type 是我们刚才配置项中 的 my_type

id 代表我们这个文档的唯一id,你如果不传,es 会自动帮你分配一个。如果我们这个数据是数据库中的,都是有自增id的,这里我建议,大家还是指定id为好,方便检索之后使用。

first_name 和 age 就是我们上面添加的一些 properties 中的字段。

好了,现在索引也好了,文档也索引进去了,我们来试着查询吧。

<?php
/**
 * Created by PhpStorm.
 * User: NickBai
 * Email: 876337011@qq.com
 * Date: 2018/12/18
 * Time: 10:34 AM
 */

use Elasticsearch\ClientBuilder;

require './vendor/autoload.php';

$hosts = [
    '127.0.0.1:9200'
];

$client = ClientBuilder::create()->setHosts($hosts)->build();

$params = [
    'index' => 'my_index',
    'type' => 'my_type',
    'body' => [
        'query' => [
            'match' => [
                'first_name' => '我名字'
            ]
        ]
    ]
];

$results = $client->search($params);
print_r($results);

里面的很多字段都有解释过来,相信这里你一眼就可以看的明白。执行可以得到如下的结果:

Array
(
    [took] => 8
    [timed_out] => 
    [_shards] => Array
        (
            [total] => 5
            [successful] => 5
            [skipped] => 0
            [failed] => 0
        )

    [hits] => Array
        (
            [total] => 1
            [max_score] => 0.5753642
            [hits] => Array
                (
                    [0] => Array
                        (
                            [_index] => my_index
                            [_type] => my_type
                            [_id] => 1
                            [_score] => 0.5753642
                            [_source] => Array
                                (
                                    [first_name] => 我的名字叫小王
                                    [age] => 22
                                )

                        )

                )

        )

)

接下来,我会讲解,如何使用 elasticSearch + ik + php 实现同义词,错误词纠错。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!