Elasticsearch学习笔记

Elasticsearch学习笔记

Elasticsearch学习笔记_第1张图片

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

或关注微信公众号选取:

Elasticsearch学习笔记_第2张图片

你可能感兴趣的:(Elasticsearch学习笔记)