在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());
        }
    }
}
广告
将在 10 秒后关闭
bannerAds