中小型网站结合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的简单应用。
#笔记 #记录