前言
久仰elasticsearch大名,近年来,fackbook,baidu等大型网站的搜索功能均开始采用elasticsearch,足见其在处理大数据和高并发搜索中的卓越性能。不少其他网站也开始将elasticsearch作为搜索功能中的一个重要选项,从招聘启事的人员技能要求上就可见一斑。elasticsearch虽然是基于java开发,但是他提供了Restful接口的形式供其他程序调用,非常的方便,对于php,python等其他语言也有对应的扩展支持。所以很有必要学习一下elasticsearch。
安装
笔者在centos6.8环境下安装,安装的是elasticsearch-6.2.4。参考:PHP_elasticsearch搜索引擎的安装与使用 安装,但是安装后启动出现的大量error,需要搜索对应解决方案,比较麻烦,但还是都可以顺利的解决。可见一个新的程序出来总是有不少的问题,php的安装和使用就相对来说要顺畅不少。
之后我又安装了elasticsearch-head,一个图形化查询管理elasticsearch的插件。安装过程也不是很顺畅,通过搜索解决。
初步使用
首先需要明白的是,elasticsearch里面的一些名词和传统关系型数据库(如mysql)的对应关系,其实还都是一一对应的,换了名字,要重新记忆一下。
Relational DB -> Databases(数据库) -> Tables(表) -> Rows(行) -> Columns(列) Elasticsearch -> Indices(索引) -> Types(类型) -> Documents(文档) -> Fields(字段)
我习惯用php语言,所以使用的是elasticsearch-php6.0扩展来操作elastcsearch。它的官方文档地址,非常有用。要注意安装的elasticsearch-php版本,版本过低可能无法操作elastcsearch。
安装完成后,就可以操作啦。下面是一个简单的例子,将数据库里面的数据读取出来,转存到elasticsearch,并且可以查询数据,还可以模糊查询数据(sql里面的like查询)。注意的是转存后需要sleep一下,否则不能立刻查询出结果。
<?php /* * 简单运用elasticsearch实例,创建索引,查询数据。 */ require_once('vendor/autoload.php'); use ElasticsearchClientBuilder; function get_conn(){ $host = '127.0.0.1'; $dbname = 'test'; $user = 'root'; $passwd = '123456'; $conn = new PDO("mysql:dbname=$dbname;host=$host",$user,$passwd, array(PDO::ATTR_PERSISTENT => true)); $flag = $conn->exec('set names utf8'); return $conn; } function create_index(){ //Elastic search php client $client = ElasticsearchClientBuilder::create()->build(); $sql = "SELECT * FROM tb_voteoption"; $conn = get_conn(); $stmt = $conn->query($sql); $rtn = $stmt->fetchAll(); //delete index which already created $params = array(); $params['index'] = 'test'; $client->indices()->delete($params); //create index $rtnCount = count($rtn); for($i=0;$i<$rtnCount;$i++){ $params = array(); $params['body'] = array( 'voteOptionID' => $rtn[$i]['voteOptionID'], 'voteID' => $rtn[$i]['voteID'], 'voteOptionName' => $rtn[$i]['voteOptionName'], 'ticketNum' => $rtn[$i]['ticketNum'] ); $params['index'] = 'test'; $params['type'] = 'tb_voteoption'; //Document will be indexed to test/tb_voteoption/autogenerate_id var_dump($params); $client->index($params); } echo 'create index done!'; } function search(){ //Elastic search php client $client = ElasticsearchClientBuilder::create()->build(); $params = array(); $params['index'] = 'test'; $params['type'] = 'tb_voteoption'; $params['body']['query']['match']['voteOptionID'] = '54'; $rtn = $client->search($params); var_dump($rtn); } /*类似于sql里面的like查询*/ function like_search(){ //Elastic search php client $client = ElasticsearchClientBuilder::create()->build(); $params = array(); $params['index'] = 'test'; $params['type'] = 'tb_voteoption'; $params['body']['query']['wildcard'] = array('voteOptionName'=>'王*'); $rtn = $client->search($params); var_dump($rtn); } set_time_limit(0); error_reporting(E_ALL); ini_set('display_errors','on'); create_index(); sleep(5); //建好索引后需要sleep,否则查询不出数据 search(); like_search(); ?>
里面用到的数据库数据,可以用以下sql语句创建。
DROP TABLE IF EXISTS `tb_voteoption`; CREATE TABLE `tb_voteoption` ( `voteOptionID` int(11) NOT NULL AUTO_INCREMENT, `voteID` int(11) DEFAULT NULL, `voteOptionName` varchar(255) CHARACTER SET gb2312 DEFAULT NULL, `ticketNum` int(11) DEFAULT '0', PRIMARY KEY (`voteOptionID`), KEY `voteID` (`voteID`) ) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=utf8 COMMENT='投票选项表'; INSERT INTO `tb_voteoption` VALUES ('51', '13', '朱芳宇', '0'); INSERT INTO `tb_voteoption` VALUES ('52', '13', '王治郅', '1'); INSERT INTO `tb_voteoption` VALUES ('53', '13', '姚明', '0'); INSERT INTO `tb_voteoption` VALUES ('54', '13', '易建联', '0');