在FuelPHP中使用Elastica来使用Elasticsearch- 1.引言
描述
从FuelPHP 1.7.2开始,我们将尝试使用最流行的 “Elasticsearch·通吃搜索引擎”。
但从普通的PHP使用Elasticsearch并没有特别的区别。
在访问Elasticsearch时,有几种方法可以考虑,但这次我们将尝试使用称为Elastica的库。
准备Java运行时环境并安装Elasticsearch,然后通过composer安装Elastica,这大致是流程。顺便一提,我们也可以安装Kuromoji用作日语形态分析。
顺便提一下,我们的操作系统是CentOS6。
安装Java运行时。
Elasticsearch的运行需要Java。我们已经将它安装在/usr/java/目录下,如果需要的话,您可以根据需要更改安装位置。
用以下方式获取Java开发工具包(JDK)7u67的Linux x64版本,并将其解压到`/usr/java/`目录下:
“`
\$ wget -O jdk-7u67-linux-x64.tar.gz –no-cookies –no-check-certificate –header “Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie” “http://download.oracle.com/otn-pub/java/jdk/7u67-b01/jdk-7u67-linux-x64.tar.gz”
\$ sudo mkdir /usr/java/
\$ sudo tar xzf jdk-7u67-linux-x64.tar.gz -C /usr/java/
“`
关于使用的运行时,请进行一些补充说明。
从Java 1.7u25之后,到1.7u55之前的Java版本,在使用Elasticsearch(使用的是Lucene)时无法正常工作。
因此,在不久之前,建议在使用Elasticsearch时使用1.7u25版本。
由于1.7u55修复了存在的问题和漏洞,目前不再需要使用1.7u25版本。
参考:http://www.elasticsearch.org/blog/java-1-7u55-safe-use-elasticsearch-lucene/
安装Elasticsearch
Elastica的版本号与Elasticsearch本体的版本同步。
由于当前最新稳定版的Elastica为1.3.4,我们将安装Elasticsearch的1.3.4版本。
使用wget命令下载https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.3.4.noarch.rpm文件
使用sudo yum localinstall命令安装elasticsearch-1.3.4.noarch.rpm文件
使用echo命令将”export JAVA_HOME=/usr/java/jdk1.7.0_67″添加到/etc/sysconfig/elasticsearch文件中。
我会启动Elasticsearch,并确认是否正确安装。
\$ sudo /etc/init.d/elasticsearch start
\$ curl -XGET localhost:9200/_cluster/health?pretty使用sudo /etc/init.d/elasticsearch start命令启动elasticsearch
使用curl -XGET localhost:9200/_cluster/health?pretty命令获取集群健康状态。
安装Kuromoji
为了进行日语形态素解析,将引入Kuromoji。
由于Elasticsearch版本为1.3.4,所以将使用Kuromoji的2.3.0版本。
\$
sudo JAVA_HOME=/usr/java/jdk1.7.0_67 /usr/share/elasticsearch/bin/plugin -install elasticsearch/elasticsearch-analysis-kuromoji/2.3.0将elasticsearch的kuromoji插件安装到/usr/share/elasticsearch/bin/plugin目录下,并设定JAVA_HOME为/usr/java/jdk1.7.0_67。
\$
echo “index.analysis.analyzer.default.type: custom” | sudo tee -a /etc/elasticsearch/elasticsearch.yml将”index.analysis.analyzer.default.type: custom”添加至/etc/elasticsearch/elasticsearch.yml文件中。
\$
echo “index.analysis.analyzer.default.tokenizer: kuromoji_tokenizer” | sudo tee -a /etc/elasticsearch/elasticsearch.yml将”index.analysis.analyzer.default.tokenizer: kuromoji_tokenizer”添加至/etc/elasticsearch/elasticsearch.yml文件中。
弹性带(Elastica)的安装
为了将FuelPHP与Elastalert集成,我们需要安装一个名为Elastica的库。
虽然Elastica不是专为FuelPHP开发的,因此命名规则等与FuelPHP本身不同,但我们忽略这些细节,以免过于纠结。
使用composer可以相对容易地进行安装。
在FuelPHP的安装目录下的composer.json文件中,在require部分添加以下内容。
"ruflin/Elastica": "dev-master"
“require”可以用以下方式表达。
"require": {
"php": ">=5.3.3",
"composer/installers": "~1.0",
"fuel/docs": "1.7.2",
"fuel/core": "1.7.2",
"fuel/auth": "1.7.2",
"fuel/email": "1.7.2",
"fuel/oil": "1.7.2",
"fuel/orm": "1.7.2",
"fuel/parser": "1.7.2",
"fuelphp/upload": "2.0.1",
"monolog/monolog": "1.5.*",
"michelf/php-markdown": "1.4.0",
"ruflin/Elastica": "dev-master"
},
只需要更新一下,就能安装成功,并且可以通过FuelPHP的自动加载器来调用Elastica类。
使用PHP命令运行Composer.phar文件进行更新。
我只是想试试看
使用 RSS River 插件,将 Hatena Bookmarks 的 RSS 注册到索引中,并尝试使用 var_dump 打印搜索结果。
在中国,只需要一个选项来翻译以下内容:
\$ sudo JAVA_HOME=/usr/java/jdk1.7.0_67 /usr/share/elasticsearch/bin/plugin -install fr.pilato.elasticsearch.river/rssriver/1.3.0
\$ sudo /etc/init.d/elasticsearch/restart¥ sudo JAVA_HOME=/usr/java/jdk1.7.0_67 /usr/share/elasticsearch/bin/plugin -install fr.pilato.elasticsearch.river/rssriver/1.3.0
¥ sudo /etc/init.d/elasticsearch/restart
<?php
class Controller_Test extends Controller
{
const FEED_INDEX_NAME = 'hatebu';
const RIVER_TYPE_NAME = 'hatebu';
const RIVER_FEED_URL = 'http://b.hatena.ne.jp/entrylist/it?sort=hot&threshold=&mode=rss';
private function get_client()
{
return new Elastica\Client(array(
'host' => 'localhost',
'port' => 9200
));
}
public function action_register()
{
$elastica_client = $this->get_client();
$feed_index = $elastica_client->getIndex(self::FEED_INDEX_NAME)
->create(array(), false);
$elastica_client->getIndex('_river')
->getType(self::RIVER_TYPE_NAME)
->addDocument(
new Elastica\Document('_meta', array(
'type' => 'rss',
'rss' => array(
'feeds' => array(
array(
'name' => self::FEED_INDEX_NAME,
'url' => self::RIVER_FEED_URL
)
)
)
))
);
echo 'ok';
}
public function action_search($param)
{
$results = $this->get_client()
->getIndex(self::FEED_INDEX_NAME)
->search($param);
foreach ($results as $result)
{
var_dump($result->getData());
}
}
}