Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。不管在开源仍是专有领域,Lucene能够被认为是迄今为止最早进、性能最好的、功能最全的搜索引擎库。html
可是,Lucene只是一个库。想要使用它,你必须使用Java来做为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene很是复杂,你须要深刻了解检索的相关知识来理解它是如何工做的。java
Elasticsearch也使用Java开发并使用Lucene做为其核心来实现全部索引和搜索的功能,可是它的目的是经过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。laravel
若是没有搜索引擎,单单凭借Mysql提供的简单搜索功能,不管在性能仍是效果上都不尽如人意,继承程序猿的折腾属性,决定将本身的博客插上Elasticsearch的翅膀。git
sudo apt-get update sudo apt-get install openjdk-8-jdk
下载github
wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-2.3.4.deb sudo dpkg -i elasticsearch-2.3.4.deb
目前ElasticSearch的中文分词插件IK最高版本为1.9.4,兼容Elasticsearch的2.3.4版本。web
安装sql
sudo dpkg -i elasticsearch-2.3.4.deb
开机自启动数据库
sudo update-rc.d elasticsearch defaults 95 10 sudo service elasticsearch start
测试服务器
curl http://localhost:9200
你若是你看到如下信息,说明你的ElasticSearch已安装成功。app
{ "name" : "Peter Petruski", "cluster_name" : "elasticsearch", "version" : { "number" : "2.3.4", "build_hash" : "...(隐藏)", "build_timestamp" : "2016-06-30T11:24:31Z", "build_snapshot" : false, "lucene_version" : "5.5.0" }, "tagline" : "You Know, for Search" }
默认状况下 Elasticsearch 的 RESTful 服务只有本机才能访问,也就是说没法从主机访问虚拟机中的服务。为了方便调试,能够修改 /etc/elasticsearch/config/elasticsearch.yml
文件,加入如下两行:
network.bind_host: “0.0.0.0" network.publish_host: \_non_loopback:ipv4_
Elasticsearch原装分词器会简单地拆分每一个汉字,没有根据词库来分词,这样的后果就是搜索结果极可能不是你想要的。这里推荐使用elasticsearch-analysis-ik,支持自定义词库。
下载
wget https://github.com/medcl/elasticsearch-analysis-ik/archive/v1.9.4.tar.gz
解压
tar -xvf elasticsearch-analysis-ik.tar.gz
使用maven打包该java项目
cd elasticsearch-analysis-ik-1.9.4 mvn package
在plugins目录下建立ik目录,并将打包好的IK插件解压到其中
mkdir /usr/share/elasticsearch/plugins/ik unzip target/releases/elasticsearch-analysis-ik-1.9.4.zip -d /usr/share/elasticsearch/plugins/ik/
elasticsearch-analysis-ik 的配置文件在 ~/{es_root}/plugins/ik/config/ik/
目录,不少都是词表,直接用文本编辑器打开就能够修改,改完记得保存为 utf-8 格式。
如今再启动 Elasticsearch 服务,若是看到相似下面这样的信息,说明 IK Analysis 插件已经装好了
plugins [analysis-ik]
在使用以前,先大概了解下ES的特色:
网上一般会将Elasticsearch和传统关系型数据库Mysql作一下类比:
MySQL | Elasticsearch |
---|---|
Database(数据库) | Index (索引) |
Table(表) | Type (类型) |
Row (行) | Document (文档) |
Column (列) | Field (字段) |
Schema (方案) | Mapping (映射) |
Index (索引) | Everything Indexed by default (全部字段都被索引) |
SQL (结构化查询语言) | Query DSL (查询专用语言) |
Elasticsearch不只仅是全文搜索:
分布式的实时文件存储,每一个字段都被索引并可被搜索
分布式的实时分析搜索引擎
能够扩展到上百台服务器,处理PB级结构化或非结构化数据
分布式、实时、每一个字段、PB级,有点不明觉厉~ 不要慌,刚认识不熟悉很正常,慢慢接触,天然就熟络了,stop getting off track(回归正题),想要详细认识ES,请移步Elasticsearch权威指南,接下来就是一步步将ES集成进项目当中:
1. 使用package
能够直接使用官方提供的package,因为不想花时间重复造轮子,我直接使用进一步封装的第三方package。在github上有好几个可用的,我选了Elasticquent,部分是由于名字和laravel的Eloquent比较搭(笑...)。Elasticquent提供了简洁好用的trait,直接集成进你的Model里,例如Article:
... use Elasticquent\ElasticquentTrait; class Article extends Model { use ElasticquentTrait; ... }
而后就能够优雅的使用Elasticsearch了,具体如何安装使用,请参考Elasticquent的说明文档。
2. 配置Mapping
关于Mapping(映射),我找到了一篇专门介绍它的文章(传送们),通俗易懂。
文章中提到,mapping不只告诉ES一个field中是什么类型的值, 它还告诉ES如何索引数据以及数据是否能被搜索到。
Got it! 也就是说,若是咱们不配置mapping,那ES就不会知道咱们是想让它按照IK的分词方式来进行索引咯~
到这里,不得不说这是一个坑,目前网上的不少资料由于使用的是老版本的ES和IK,因此index和mapping的配置通常都放在es的配置文件yml当中。但我按照那种配置方法,并无达到预期的分词效果,ES仍是简单粗暴的将汉字一个个的切开,屡败屡战折腾两天以后,终于想到试着使用Elasticquent说明文档里在Model中配置mapping的方式,果真,豁然开朗:
curl -XGET 'http://localhost:9200/_analyze?analyzer=ik&pretty=true&text=%e4%bd%a0%e5%a5%bd%e9%ba%a6%e8%82%af%e5%85%88%e7%94%9f'
{ "tokens" : [ { "token" : "你好", "start_offset" : 0, "end_offset" : 2, "type" : "CN_WORD", "position" : 0 }, { "token" : "麦", "start_offset" : 2, "end_offset" : 3, "type" : "CN_WORD", "position" : 1 }, { "token" : "肯", "start_offset" : 3, "end_offset" : 4, "type" : "CN_WORD", "position" : 2 }, { "token" : "先生", "start_offset" : 4, "end_offset" : 6, "type" : "CN_WORD", "position" : 3 }] }
附上个人mapping配置代码
protected $mappingProperties = array( 'title' => array( 'type' => 'string', 'analyzer' => 'ik_max_word' ), 'content' => array( 'type' => 'string', 'analyzer' => 'ik_max_word' ) );
能够看出,我告诉ES,个人title和content字段是string类型并且请按照ik的分词方式帮我检索。
3. 建立索引
直接使用Elasticquent提供的createIndex方法建立,若是想把现有文档所有索引,可使用addAllToIndex方法,简单愉快。
Article::createIndex($shards = null, $replicas = null); Article::addAllToIndex();
4. 增删改查
在你的控制器里的增删改查方法中,将Elasticquent提供的相应操做索引的方法依次加上便可,完成以后,那么你对文档的操做就会同步ES的索引了。具体代码请直接移步Elasticquent开源项目中trait里的代码就好,这里再也不贴出。
在此以前,了解过sphinx,使用过配置好的xunsearch,但真正本身从零开始研究全文搜索引擎仍是头一次,中间遇到了许多坑,虽然被坑郁闷,但也感谢这些坑,毕竟越过去就会有快感。写这篇文章一来做为记念和起点,二来但愿能多少对别人有点帮助,由于我也是看过好多相关的文章才一点点将ES搭建完成,在这里感谢那些乐于分享的前辈。
固然,Elasticsearch功能很强大,各类插件各类配置,这篇文章须要完善的地方还有不少,后期会不断更新,若是文中有错误或者不严谨的地方,欢迎留言交流。
PS. 最后贴出我项目中的Dockerfile,方便感兴趣的同窗使用。
原文连接:https://macken.me/article/elasticsearch-for-search