ElasticSearch笔记

ElasticSearch是一款非常优秀的分布式搜索程序,提供RESTful API,底层基于Lucene,采用多shared方式保证数据安全,提供自动resharding功能。

为什么要使用ElasticSearch呢?最开始时使用MySQL进行简单搜索,不能索引LIKE语句直接拉低MySQL性能。后来考虑Sphinx,但在数据量级、多台MySQL、搜索服务本身的HA、后续扩容等问题上,Sphinx并不是一个最优的选择。

对于ES项目中使用需解决的问题:

  • 索引:对需搜索的数据,如何建立合适的索引,需根据特定语言使用不同的analyzer等。
  • 搜索:ES提供非常强大的搜索功能,如何写出高效的搜索语句呢?
  • 数据源:MySQL是唯一的数据源,如何将MySQL的数据导入到ES呢?

由于数据都是从MySQL生成,index的field是固定的,主要做的工作就是根据业务场景设计好对应的mapping和search语句,并不断调优。

对于数据源,需工具将MySQL的数据导入ES,由于对搜索实时性要求很高,需将MySQL增量数据实时导入,可通过row based binlog来完成。

ES关键概念

数据层面

  • index:ES用来存储数据的逻辑区域,类似于关系型数据库中的db的概念。一个index可在一个或多个shard上,同时一个shard也可能会由多个replicas。
  • document:ES里存储的实体数据,类似于关系数据中一个table里的一行数据。document由多个field组成,不同的document里同名的field一定具有相同的类型。document里field可重复出现,也就是一个field会由多个值,即multivalued。
  • document type:为了查询需要,一个index可能会由多种document,也就是document type。不同document中同名的field一定要是相同类型的。
  • mapping:存储field的相关映射信息,不同document type会有不同的mapping。

对比MySQL,需要大概认为index就是db,document就是一行数据,field就是table的column,mapping就是table的定义,document type就是一个table就可以了。

document type是为了更好的查询,例如一个index可能一部分数据我们想使用一种查询方式,而另一部分数据想使用另一种查询方式,于是就由2种type。不过这种情况应该在项目中不会出现,所以通常一个index下面仅仅会由一个type。

服务层面

  • node:一个server的实例
  • cluster:多个node组成的cluster
  • shard:数据分片,一个index可能会存在于多个shards,不同shards可能在不同nodes。
  • replica:shard的备份,由一个primary shard,其余的叫做replica shards。

ES之所以能动态resharding,主要在于它最开始就预先分配了多个shards,然后以shards为单位进行数据迁移。这种做法其实在分布式领域非常普遍,codis就是使用1024个slot来进行数据迁移。

RESTful API

ES提供了RESTful API,使用JSON格式,使得非常利于与外部交互。RESTful接口很简单,一个URL表示一个特定的资源,例如/blog/article/1表示index为blog,type为article,id为1的document。

使用HTTP标准method来操作这些资源

  • POST 新增
  • PUT 更新
  • GET 获取
  • DELETE 删除
  • HEAD 判断是否存在。

HTTPIE

推荐HTTPIE,非常强大的HTTP工具,类似curl,几乎是命令行调试ES的绝配。

# get
$ http GET : 9200/blog/article/1

# create
$ http POST :9200/blog/article/1 title="hello" tags:='["elasticsearch"]'

# update
$ http PUT :9200/blog/article/1 title="hello" tags:='["elasticsearch","world"]'

# delete
$ http DELETE :9200/blog/article/1

# exists
$ http HEAD :9200/blog/article/1

索引和搜索

虽然ES能自动判断field类型并建立合适的索引,推荐自己设置相关的索引规则,这样才能更好的为后续的搜索服务。通过定制mapping的方式来设置不同field的索引规则。对于搜索,ES提供太多的搜索选项。索引和搜索是ES非常重要的两个方面,直接关系到产品的搜索体验。

同步MySQL数据

ES很强大但要建立在足够数据的情况下,如何将MySQL的数据导入ES。虽然现在有一些实现,譬如elasticsearch-river-jdbc或elasticsearch-river-mysql。

elasticsearch-river-jdbc功能很强大,但并没很好支持增量数据更新的问题,需要对应的表只增不减,而这几乎在项目中是不能办到的。

elasticsearch-river-mysql采用了python-mysql-replication来通过binlog获得变更的数据,进行增量更新,貌似处理MySQL dump数据导入的问题。

你可能感兴趣的:(ElasticSearch笔记)