中小型网站结合mysql搭建elasticsearch分词搜索系统
Elasticsearch是什么,用来做什么?这个就不重复了,相信你读到这篇文章时,对elasticsearch已有了解。对于中小型网站来说,怎样合理地搭建elasticsearch分词搜索系统呢?这里记一下个人心得,以便新人少走些弯路。
本文操作环境:PHP + Mysql + Elasticsearch + Elasticsearch-PHP
PHP上使用es需要安装Elasticsearch-php,Elasticsearch-PHP 的版本要和 Elasticsearch 版本适配。
Elasticsearch的安装这里就略去了,注意的地方主要是选择合适的Elasticsearch的版本,因为不同版本的es用法还是有些细微区别。
要使用Elasticsearch,关键的地方是导入查询数据。
Elasticsearch本身就是一个数据库,普通中小网站大多使用mysql数据库,所以应用es时就涉及到两种数据库的配合。一种方法是放弃mysql只用es做后台数据库,阿里腾讯云等都提供了这种专门的Elasticsearch数据库,不过要多花点银子,此外应用起来也需要学很多新东西,对新人来说有点难度。另外一种方法就是mysql和es结合使用,这也是明生(monseng)推荐的中小网站应用es的方法。
以下以mysql结合es使用为例,记一下个人心得。
网站使用elasticsearch分词检索,首先需要将mysql中数据查询出来并写入到elasticsearch中,同时要实现mysql和es数据源的同步更新,以保证es索引为最新数据。难点和节点其实也在这里,就是mysql中数据写入到elasticsearch索引。
方案一:使用第三方建站工具
如果你想闭着眼睛也可以在自己的网站上简单使用Elasticsearch的话,其实也是一件非常容易的事情。可以借助第三方建站工具来实现,比如说使用wordpress,免费ElasticPress 插件可以轻松搭建elasticsearch应用。
不过,wp+es运行起来有点吃内存,这也是wordpress让人诟病的地方。
方案二、使用elasticsearch-PHP接口
直接操作es有点太暴力了,难度也大,我们可以借助现成的client包来完成es的使用。
Elasticsearch-PHP是官方提供的PHP客户端,可以方便操作es。简单来说,elasticsearch-PHP可以为php端提供更简洁易用的封装方法,以方便建立es索引和进行检索。
PHP版的client包叫做Elasticsearch-php,可Git_hub上直接下载地址:https://github.com/elasticsearch/elasticsearch
一、Elasticsearch-php的安装和启动
这也很简单,几个命令就完成了,具体可查看官方说明:
https://www.elastic.co/guide/cn/elasticsearch/php/current/_installation_2.html
官方elasticsearch-php也提供了Composer自动安装方法,主要是两条命令:第一个命令来安装 composer.phar ,第二个命令来执行安装程序。
curl -s http://getcomposer.org/installer | php
php composer.phar install --no-dev
Elasticsearch-php的安装也略去了,官方说明已经非常清楚,照着操作一般都没问题,如果这个都有问题的话,真正应用es就不方便了,得补一下课。
索引相当于 MySQL 中的表,文档相当于MySQL 中的行记录。
一、Elasticsearch-php的加载
require './vendor/autoload.php';
use Elasticsearch\ClientBuilder;
$client = ClientBuilder::create()->build();
也就是实例化一个es类。
二、elasticsearch进行建立索引和进行检索
Elasticsearch-php实例化完成后,就可以连接mysql进行es索引的增删改查了。
这里以网上流行的代码为例,并整理一下。
(一)从mysql中创建一个名为index的索引(表)
create_index();
function create_index(){
global $pdo;
$client = new Elasticsearch\Client();
$sql = "SELECT * FROM log";
$stmt = $pdo->query($sql);
$rtn = $stmt->fetchAll();
//如果index存在则删除原索引
$params = array();
$params['index'] = 'log_index';
$client->indices()->delete($params);
//创建index索引,包括 log_date,src_ip,dest_ip
$rtnCount = count($rtn);
for($i=0;$i<$rtnCount;$i++
){$params = array();
$params['body'] = array(
'log_date' => $rtn[$i]['log_date'],
'src_ip' => $rtn[$i]['src_ip'],
'dest_ip' => $rtn[$i]['dest_ip']
);
$params['index'] = 'log_index';
$params['type'] = 'log_type';
$client->index($params);
}
echo 'create index done!';
}
(二)从索引index中执行查询src_ip(行记录)
search();
function search(){
$client = new Elasticsearch\Client();
$params = array();
$params['index'] = 'log_index';
$params['type'] = 'log_type';
$params['body']['query']['match']['src_ip'] = '1.122.33.141';
$rtn = $client->search($params);
var_dump($rtn);
}
(三)es返回值的读取
Elasticsearch返回的数据格式为JSON,因为Elasticsearch中的文档以JSON格式储存。
示例返回的就是JSON格式的$params数组,跟php查询mysql记录类似。
通过以上步骤的创建,基本上完成了网站中elasticsearch的简单应用。
#笔记 #记录