elasticsearch初探

12

为了替换现在使用体验比较差的SegmentFault搜索,我开始了前期搜索引擎的探索。目前首选是elasticsearch

elasticsearch需要java环境
安装java

sudo aptitude install openjdk-7-jre

下载elasticsearch
http://www.elasticsearch.org/overview/elkdownloads/
https://download.elasticsearch.org/elasticsearch/elasticsearch/elastic...

安装
因为我的环境是ubuntu,所以直接用它的deb包。

sudo dpkg -i elasticsearch-1.1.0.deb

启动

sudo /etc/init.d/elasticsearch start

jdbc river
用于定期或者实时导入需要搜索的数据
我们数据库是mysql,所以用的官方elasticsearch-river-jdbc
https://github.com/jprante/elasticsearch-river-jdbc

river jdbc quickstart
https://github.com/jprante/elasticsearch-river-jdbc/wiki/Quickstart

安装

cd /usr/share/elasticsearch
sudo /bin/plugin --install river-jdbc --url http://bit.ly/1jyXrR9

如果安装失败,可以手动下载后再安装。

sudo /bin/plugin --install river-jdbc --url file:///tmp/elasticsearch-river-jdbc-1.0.0.1.zip

创建一个JDBC river

curl -XPUT 'localhost:9200/_river/my_jdbc_river/_meta' -d '{
    "type" : "jdbc",
    "jdbc" : {
        "url" : "jdbc:mysql://localhost:3306/test",
        "user" : "root",
        "password" : "",
        "sql" : "select * from question",
        "index" : "question",
        "type" : "question"
    }
}'

测试导入效果:

curl -XGET 'localhost:9200/question/_search?pretty&q=*'

or

localhost:9200/question/_search?pretty&q=*

官方有中文分词支持,但是不是非常准确,这里使用medcl的ik分词
安装elasticsearch-analysis-ik

cd /tmp
wget https://github.com/medcl/elasticsearch-analysis-ik/archive/master.zip
unzip master.zip
cd elasticsearch-analysis-ik/

这里需要用mvn package命令打包成elasticsearch-analysis-ik-1.2.6.jar

mvn package

没有maven的可以安装一下

sudo aptitude install maven

复制elasticsearch-analysis-ik-1.2.6.jar到ES_HOME/plugins/analysis-ik下

sudo cp elasticsearch-analysis-ik-1.2.6.jar /usr/share/elasticsearch/plugins/analysis-ik

将ik的配置和字典都复制到ES_HOME/config下

sudo cp -R ik /etc/elasticsearch

elasticsearch配置启用ik

sudo vim /etc/elasticsearch

底部增加一行

index.analysis.analyzer.ik.type : 'ik'

重启服务加载配置

sudo service elasticsearch restart

测试分词效果

localhost:9200/question/_analyze?analyzer=ik&pretty=true&text=杭州堆栈科技有限公司

返回

{
  "tokens" : [ {
    "token" : "杭州",
    "start_offset" : 0,
    "end_offset" : 2,
    "type" : "CN_WORD",
    "position" : 1
  }, {
    "token" : "堆栈",
    "start_offset" : 2,
    "end_offset" : 4,
    "type" : "CN_WORD",
    "position" : 2
  }, {
    "token" : "科技",
    "start_offset" : 4,
    "end_offset" : 6,
    "type" : "CN_WORD",
    "position" : 3
  }, {
    "token" : "有限公司",
    "start_offset" : 6,
    "end_offset" : 10,
    "type" : "CN_WORD",
    "position" : 4
  } ]
}

测试官方的php客户端
官方的php客户端通过composer安装
先安装composer

curl -s http://getcomposer.org/installer | php
sudo mv composer.phar /usr/bin/composer

生成一个composer.json,写入

{
    "require": {
        "elasticsearch/elasticsearch": "~1.0"
    }
}

开始安装

composer install --no-dev

项目中require之后就可以使用了

<?php
require 'vendor/autoload.php';

$client = new Elasticsearch\Client();

使用中文分词ik的mapping

$params['index'] = 'question';
$params['type']  = 'question';    
$myTypeMapping = array(
        '_source' => array(
            'enabled' => true
        ),
        '_all' => array(
            'indexAnalyzer'  => 'ik',
            'searchAnalyzer' => 'ik',
            'term_vector'    => 'no',
            'store'          => 'false'
        ),
        'properties' => array(
            'text' => array(
                'type' => 'string',
                'term_vector' => 'with_positions_offsets',
                'indexAnalyzer' => 'ik',
                'searchAnalyzer' => 'ik',
                'include_in_all' => 'true',
                'boost' => 8
            ),
            'title' => array(
                'type' => 'string',
                'term_vector' => 'with_positions_offsets',
                'indexAnalyzer' => 'ik',
                'searchAnalyzer' => 'ik',
                'include_in_all' => 'true',
                'boost' => 8
            )
        )
    );
$params['body']['question'] = $myTypeMapping;
$response = $client->indices()->putMapping($params);

测试一下效果,搜索问题内容‘php框架’

$searchParams = array();
$searchParams['index'] = 'question';
$searchParams['type']  = 'question';
$searchParams['body']['query']['match']['text'] = 'php框架';

返回,取了几条

  1. segmentfault是用什么php框架写的啊? http://segmentfault.com/q/1010000000095152
  2. 刚学PHP,求介绍THINKPHP框架的优劣 http://segmentfault.com/q/1010000000129535
  3. symfony是不是比其他的php框架功能强大很多?
    http://segmentfault.com/q/1010000000095952
  4. python 框架繁多,如何整体把握? http://segmentfault.com/q/1010000000186319
  5. 什么是ORM,以及在php上的使用? http://segmentfault.com/q/1010000000318125
  6. codeigniter框架php依赖安装问题 http://segmentfault.com/q/1010000000253966

总结
elasticsearch安装和使用还是非常简单的,从没有优化的返回结果来看也比现有的搜索要理想。
不过唯一的缺点就是文档相比solr还是太少,很多都只给了最基本的例子。
优化 组合搜索等等,都要自己琢磨和查找。


如果觉得我的文章对你有用,请随意赞赏

你可能感兴趣的

21 条评论
Lvye 作者 · 2015年07月03日

不好意思,公司日常开发业务很忙,一直没有上马elasticsearch

+1 回复

公子 · 2014年03月31日

涨姿势,原来搜索功能这么复杂( ⊙ o ⊙ )啊!

回复

Lvye 作者 · 2014年03月31日

前期安装配置和优化需要花一点时间,但是后端开发使用其实是很简单的。

回复

公子 · 2014年03月31日

没看出很简单,比起博客搜索来说复杂多了OAQ...

回复

Lvye 作者 · 2014年03月31日

我觉得原理差不多啊,分词,然后全文搜索。

回复

公子 · 2014年03月31日

可是你写的好复杂…

回复

Lvye 作者 · 2014年03月31日

这个,为了方便后续安装测试,所以我写得比较详细了点。

回复

公子 · 2014年03月31日

嗯,加油,快把搜索做出来!!

回复

uniudy · 2014年04月01日

unbuntu -> ubuntu

回复

Lvye 作者 · 2014年04月01日

fix,ubuntu我老是敲错。

回复

weakish · 2014年04月03日

占了很多篇幅的是前面配环境,后面PHP调用还比较简单。

回复

公子 · 2014年04月03日

配环境也算是复杂的一部分..

回复

emacsist · 2014年04月04日

哈哈,我的博客 http://ljy520yzy.com 就是使用ES的,虽然慢点(主要是因为服务器内存不够),但效果非常不错。(我的博客与是参照了SF的风格 ^_^ )

回复

billie66 · 2014年07月01日

整理的很详细,是我搜索到的相关文章中讲述最清晰的一篇,赞!

回复

wTracyLiu · 2014年09月28日

很详细的文档,早看到估计能省不少时间自己折腾。有个问题想问下,我在我这边的机器上试了下 localhost:9200/question/_analyze?analyzer=ik&pretty=true&text=杭州堆栈科技有限公司, 我得到的结果 {
* tokens: [
* {
* token: 杭州
* start_offset: 0
* end_offset: 2
* type: CN_WORD
* position: 1
}
* {
* token: 杭
* start_offset: 0
* end_offset: 1
* type: CN_WORD
* position: 2
}
* {
* token: 州
* start_offset: 1
* end_offset: 2
* type: CN_WORD
* position: 3
}
* {
* token: 堆栈
* start_offset: 2
* end_offset: 4
* type: CN_WORD
* position: 4
}
* {
* token: 堆
* start_offset: 2
* end_offset: 3
* type: CN_WORD
* position: 5
}
* {
* token: 栈
* start_offset: 3
* end_offset: 4
* type: CN_CHAR
* position: 6
}
* {
* token: 科技
* start_offset: 4
* end_offset: 6
* type: CN_WORD
* position: 7
}
* {
* token: 有限公司
* start_offset: 6
* end_offset: 10
* type: CN_WORD
* position: 8
}
* {
* token: 有限
* start_offset: 6
* end_offset: 8
* type: CN_WORD
* position: 9
}
* {
* token: 公司
* start_offset: 8
* end_offset: 10
* type: CN_WORD
* position: 10
}
]
}, 不知道为啥会出现这个结果呢? 正好手边的需求更倾向于楼主的那个结果..

回复

Lvye 作者 · 2014年09月28日

是自己测试还是照着我上面来的?

回复

wTracyLiu · 2014年09月29日

是自己测试,不过分词那部分安装什么的都和文中一样..

回复

曦林 · 2015年02月01日

es的开箱即用感觉已经做得很好了

回复

Iveon · 2015年07月03日

@Lvye 一年多了,还有没有更加深入的文章呢?配置,优化什么的能多带点注释么?

回复

shaozhengmao · 2015年07月23日

我正在使用elasticsearch1.6.0
然后安装了jdbc river1.6.0.0 发现不能用
然后看到这issues
https://github.com/jprante/elasticsearch-jdbc/issues/391
看意思好像说是不支持了 囧

回复

载入中...