Elasticsearch学习笔记
Elasticsearch 权威指南(中文版)
ElasticSearch Reference
为什么要学习ElasticSearch
search engine其实很多,Lucene,Solr,ElasticSearch等等。
这些搜索引擎从应用来说各有特点,其实底层都是Lucene,也都是java开源项目。ES的特点就是实时性比较好。
对于python使用者来说其实还有其他的选择,比如知乎的KIDS,据说是可以替代ELK(elasticsearch+logstash+kibana)。知乎的人说12年的时候ELK还不是很成熟所以就自研做轮子了,但是站在现在的时间点,ElasticSearch的生态系统很完善,不学习这个学习啥呢?
这个领域的发展也很快,看出版的纸质书也跟不上。不如直接看权威指南这本书因为他的形式是电子文档。
官方的英文原版更好,我看了好多实例,中文版本的已经无法运行了,但是英文原版的还是可以的。
安装
安装包有几种,zip文件是windows平台使用的,rpm可用于centos。
这里以windows7为例说明。
准备前提条件:
jdk1.7以上
python2.6以上
安装elasticsearch
解压安装包以后,运行bin\elasticsearch.bat
如果有报错,就需要修改config文件
修改cluster.name,以免和其他cluster冲突。
编辑config/目录下的elasticsearch.yml
cluster.name: dz-es
运行以后,测试一下,es默认端口9200
curl http://localhost:9200/?pretty
{
name: "Multiple Man",
cluster_name: "dz-es",
version: {
number: "2.3.3",
build_hash: "218bdf10790eef486ff2c41a3df5cfa32dadcfde",
build_timestamp: "2016-05-17T15:40:04Z",
build_snapshot: false,
lucene_version: "5.5.0"
},
tagline: "You Know, for Search"
}
安装Kibana和sense
用来监控elasticsearch运行状态的一个web app。
这是nodejs做的一个项目,可以自己运行,不需要其他http server。
下载kibana安装包以后,解压到某个目录
在Kibana中安装插件Sense
bin\kibana.bat plugin --install elastic/sense
运行kibana
bin\kibana.bat
kibana服务器默认在5601端口
http://localhost:5601/
观察状态
http://localhost:5601/status
Lucene关键概念:
Document:用来索引和搜索的主要数据源,包含一个或者多个Field,而这些Field则包含我们跟Lucene交互的数据。
Field:Document的一个组成部分,有两个部分组成,name和value。
Term:不可分割的单词,搜索最小单元。
Token:一个Term呈现方式,包含这个Term的内容,在文档中的起始位置,以及类型。
inverted index 从term可以查询到count和document
说明:
Lucene使用Inverted index来存储term在document中位置的映射关系。
Elasticsearch关键概念
要使用Elasticsearch,需要理解几个基本概念就可以了,这些基本概念分为数据层面和服务层面两部分,下面分别说明。
数据层面:
Index:Elasticsearch用来存储数据的逻辑区域,它类似于关系型数据库中的db概念。一个index可以在一个或者多个shard上面,同时一个shard也可能会有多个replicas。
Document type:为了查询需要,一个index可能会有多种类型document,也就是会有多个 document type,但需要注意,不同的document type里面同名的field一定要是相同类型的。
Document:Elasticsearch里面存储的实体数据,类似于关系数据中一个table里面的一行数据。
document由多个field组成,不同类型的document里面同名的field一定具有相同的类型。
document里面field可以重复出现,也就是一个field会有多个值,即multivalued。
Mapping:存储field的相关映射信息,不同document type会有不同的mapping。
对于熟悉MySQL的童鞋,我们只需要大概认为Index就是一个db,document就是一行数据,field就是table的column,mapping就是table的定义,而document type就是一个table就可以了。
说明:
Document type这个概念其实很容易把人弄糊涂了,其实它就是为了更好的查询,举个简单的例子,一个index,可能一部分数据我们想使用一种查询方式,而另一部分数据我们想使用另一种查询方式,于是就有了两种type了。不过这种情况应该在我们的项目中不会出现,所以通常一个index下面仅会有一个Doctype。
下面是关系数据库和Lucene概念的对比图:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields
服务层面
Node: 一个server实例。
Cluster:多个node组成cluster。
Shard:数据分片,一个index可能会存在于多个shards,不同shards可能分布在不同nodes。
Replica:shard的备份,有一个primary shard,其余的叫做replica shards。
说明:
Elasticsearch之所以能动态resharding,主要在于它最开始就预先分配了多个shards(貌似是1024),然后以shard为单位进行数据迁移。这个做法其实在分布式领域非常的普遍,codis就是使用了1024个slot来进行数据迁移。
因为任意一个index都可配置多个replica,通过冗余备份的方式保证了数据的安全性,同时replica也能分担读压力,类似于MySQL中的slave。
ES的分布式对于client来说是透明的,也就是不用关注后面有多少个node在提供服务。
ES水平扩容也是比较平滑的,可以从一开始的一个node到后面很多node,比较适合实际使用需求。
client
elasticsearch官方提供各种语言的接口,我可能有兴趣的有:java,python,nodejs,php。
以python为例,就是elasticsearch-py,下面是常用的库和工具链的安装
$ pip install --upgrade pip setuptools
$ pip install --upgrade httpie
$ pip install --upgrade elasticsearch
$ pip install elasticsearch_dsl
其中,httpie是人机友好的curl替代品。
elasticsearch_dsl是提供dsl接口的库,相对来说比较高级,由于更加符合人的习惯可以避免单调的api带来的人工输入错误,建议使用这个库。
同步MySQL数据
elasticsearch本身没有数据,需要从其他数据源导入数据,常见的数据源如关系数据库mysql。
看过一些相关的开源项目,有些产品能够同步MySQL数据却是一次性的,不能考虑到增量更新,就忽略了。
相对来说,我个人比较喜欢的是elasticsearch-river-mysql和meepo。
其实他们两个都基于python-mysql-replication。meepo是饿了么的产品,比较有特点,对于喜欢eventsourcing的用起来很舒服。另外meepo也考虑到了用于cache系统的refresh/invalidate.
elasticsearch-river-mysql
Mysql River Plugin for ElasticSearch
https://github.com/scharron/elasticsearch-river-mysql
开发语言是java。
meepo
Meepo is event sourcing and event broadcasting for databases.
https://github.com/eleme/meepo
可以做很多事情,包括replication, eventsourcing, cache refresh/invalidate, real-time analytics等等.
开发语言是python
go-mysql-elasticsearch
Sync MySQL data into elasticsearch
https://github.com/siddontang/go-mysql-elasticsearch
开发语言是go。
远期目标:实现的是一个通用MySQL syncer组件,即可用于mysql和es的同步,也可用于和cache的同步。目前来说,这个项目还没有用于生产环境不够成熟,喜欢go语言的可以跟踪一下这个产品。
想加入更多乐读创业社的活动,请访问网站→http://ledu.club
或关注微信公众号选取: