视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
PHP基于ElasticSearch做搜索
2020-11-03 18:19:14 责编:小采
文档


PHP基于ElasticSearch做搜索

在做搜索的时候想到了 ElasticSearch ,而且其也支持 PHP,所以就做了一个简单的例子做测试,感觉还不错,做下记录。

环境

php 7.2

elasticsearch 6.2 下载

elasticsearch-php 6 下载

安装 elasticsearch

下载源文件,解压,重新建一个用户,将目录的所属组修改为此用户,因为 elasticsearch 无法用 root 用户启动。

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.3.tar.gz
tar zxvf elasticsearch-6.2.3.tar.gz
useradd elasticsearch
password elasticsearch
chown elasticsearch:elasticsearch elasticsearch-6.2.3
cd elasticsearch-6.2.3
./bin/elasticsearch // 启动

安装 PHP 扩展

我这里使用的是 composer 安装 elasticsearch-php。在 composer.json 文件中加入 "elasticsearch/elasticsearch": "~6.0",执行 composer update。

{
 "require": {
 // ...
 "elasticsearch/elasticsearch": "~6.0"
 // ...
 }
}

测试例子

创建表和测试数据

我这里准备了一张文章表来进行测试,首先是建表,其次写入测试数据,准备工作完毕之后,就开始编辑测试用例。

create table articles(
 id int not null primary key auto_increment,
 title varchar(200) not null comment '标题',
 content text comment '内容'
);
insert into articles(title, content) values ('Laravel 测试1', 'Laravel 测试文章内容1'),
('Laravel 测试2', 'Laravel 测试文章内容2'),
('Laravel 测试3', 'Laravel 测试文章内容3');

从 Mysql 读取数据

try {
 $db = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', 'root');
 $sql = 'select * from articles';
 $query = $db->prepare($sql);
 $query->execute();
 $lists = $query->fetchAll();
 print_r($lists);
} catch (Exception $e) {
 echo $e->getMessage();
}

实例化

require './vendor/autoload.php';
use ElasticsearchClientBuilder;
$client = ClientBuilder::create()->build();

名词解释:索引相当于 MySQL 中的表,文档相当于 MySQL 中的行记录

elasticsearch 的动态性质,在添加第一个文档的时候自动创建了索引和一些默认设置。

将文档加入索引

foreach ($lists as $row) {
 $params = [
 'body' => [
 'id' => $row['id'],
 'title' => $row['title'],
 'content' => $row['content']
 ],
 'id' => 'article_' . $row['id'],
 'index' => 'articles_index',
 'type' => 'articles_type'
 ];
 $client->index($params);
}

从索引中获取文档

$params = [
 'index' => 'articles_index',
 'type' => 'articles_type',
 'id' => 'articles_1'
];
$res = $client->get($params);
print_r($res);

从索引中删除文档

$params = [
 'index' => 'articles_index',
 'type' => 'articles_type',
 'id' => 'articles_1'
];
$res = $client->delete($params);
print_r($res);

删除索引

$params = [
 'index' => 'articles_index'
];
$res = $client->indices()->delete($params);
print_r($res);

创建索引

$params['index'] = 'articles_index'; 
$params['body']['settings']['number_of_shards'] = 2; 
$params['body']['settings']['number_of_replicas'] = 0; 
$client->indices()->create($params);

搜索

$params = [ 
 'index' => 'articles_index',
 'type' => 'articles_type',
]; 
$params['body']['query']['match']['content'] = 'Laravel';
$res = $client->search($params);
print_r($res);

下载本文
显示全文
专题