Elastic Search

Elastic Search是基于Lucene的搜索引擎服务器,面向文档的json数据传输,分布式高可用。现在已经成功搜索引擎的最流行框架,代替Solr、Splunk、Sphinx。

Elastic Search的基于地理位置信息的搜索,可以代替PostgreSQL和MongoDB对应的功能。

Elastic Search的版本使用5.x,最新是5.6.3,操作系统选择CentOS 7.4 64位 + java8。对于CentOS6.x,有一些如SecComp不支持导致es启动不来。

官方教程文档

1. 概念及常用技巧

概念: ES是面向文档的,使用JSON格式表示。只要丢给ES是json对象或json字符串即可被识别。

ElasticSearch的url是restful风格设计的,可以定位到资源的位置:/索引index/文档类型type/文档id。index、type都不需要事前创建或定义schema。

索引名称就相当于一个数据库,索引名称必须是小写字母
文档类型就相当于一个表
文档id就相当于每一行的主键,es的文档有版本控制,也即有CAS同步控制。
每一行的信息就是json内容

由于2.x开始,不支持按type为粒度来删除,所以建议还是以index为粒度来管理数据。也即文档类型type被弱化了。

ElasticSearch是集群的,靠集群名称cluster_name唯一标识,在同一个局域网的es节点会自动形成一个cluster集群。

分片shards和副本replicas,es会把逻辑上的大文件拆分成物理的分片文件,并保持多份副本在多个节点上。分片是es管理数据的单元文件。分片的主要原因:水平扩展以支持超大文件,提高性能和吞吐量。而副本保证了数据的安全、系统的可用性和提高系统性能吞吐量。

分片和副本可以在创建index时配置,但当es启动后,就只能修改副本数,不能修改分片数。默认配置,分片数是5,副本数是1.

注:每一个es分片,实际上就是一个lucene index,每个lucene index的文档限制数是2147483519

复杂数据类型

地图经纬度点类型:geo_point类型。

二维不规则图形:geo_shape类型,未了解。

2. 版本选择和安装

elasticsearch官网下载elasticsearch-5.6.3.tar.gz,解压到任意目录,windows或linux均可执行,需要java环境。

ElasticSearch的配置文件在config/elasticsearch.yml,下面操作都是修改这个文件。

修改为端口监听在外网网卡 0.0.0.0

配置文件加上一行network.host: 0.0.0.0,重启elasticsearch。由于ES没有密码,注意安全问题,可以用防火墙来做。

修改系统资源限制

修改/etc/sysctl.conf增加一行vm.max_map_count=655360,然后执行命令sysctl -p

假设运行ES的用户名是admin,那么修改/etc/security/limits.conf最尾加上:

admin soft nofile 65536
admin hard nofile 131072
admin soft nproc 2048
admin hard nproc 4096

然后admin重新登录即可。

修改ES的数据data和日志log位置

官方推荐自行配置data和log的位置,默认会在es目录下。修改配置文件:

path.logs: /path/to/logs
path.data: /path/to/data

启动

ES_JAVA_OPTS="-Xms1g -Xmx1g" bin/elasticsearch -d  # 设置内存为1G

启动同时制定集群名称和节点名称:./elasticsearch -Ecluster.name=my_cluster_name -Enode.name=my_node_name

启动之后,默认会监听在9200和9300端口,9200是http接口,9300是二进制接口。

停止elastic search

直接kill掉对应的elastic search java进程。

查看elastic search是否启动成功

访问http://IP:9200/,如果出现elastic search的版本等信息的json数据,说明启动成功了。

常用URL

URL说明
/_cat/health?v显示es的健康情况,green是正常的,yellow是有些副本没有定位到,red是有问题
/_cat/nodes?v获得集群中的节点列表,节点内存 cpu 负载
/_cat/indices?v显示所有的索引
/index/type/id通过直接定位到一条记录,注意没有_cat

搜索用 /index_name/_search?查询参数来操作,索引可以一次查询若干个,使用模糊*表达式,也可以用逗号隔开,也可以指定不要哪个索引-

关于查询的3个重要工具:

  1. 查询json,支持组合语句,搜索配置内容json是很强大的。
  2. filter filter过滤不会影响score评分,也可以避免不必要的计算分数
  3. aggregation 用于统计,类似于sql的group by和对应聚合函数,aggs可以嵌套,很常见。语义有些晦涩

3. 5.x版本的插件或GUI

使用SQL语句进行查询

官方网站

安装:

/bin/elasticsearch-plugin install https://github.com/NLPchina/elasticsearch-sql/releases/download/5.6.3.0/elasticsearch-sql-5.6.3.0.zip
#或者离线安装,先把elasticsearch-sql-5.6.3.0.zip下载到机器/tmp目录
/bin/elasticsearch-plugin install file:/tmp/elasticsearch-sql-5.6.3.0.zip

然后重启Elastic Search。安装之后,再安装一个浏览插件,这个浏览插件包含了sql查询和head工具:

git clone https://github.com/NLPchina/elasticsearch-site.git
修改端口为9100
./run.sh start

然后修改ES配置文件,增加:

http.cors.enabled: true
http.cors.allow-origin: "*"

然后重启ES

head插件的官方网址:https://github.com/mobz/elasticsearch-head

常用SQL语句:

  • show
    show *        显示所有的index
    show index     (当一个index下只有一个type时,就会直接显示field)
    show index/type      显示type下面的filed列表
  • select
    select fields from index where ...
    select fields from index1,index2
    select fileds from index/type
    select fields from index/type1,index/type2
    等多种写法,可以group byorder by

另外一个插件工具mirage

https://github.com/appbaseio/mirage TODO未试

数据模型mapping定义工具

https://github.com/appbaseio/gem TODO未试

ik中文分词器

TODO https://github.com/medcl/elasticsearch-analysis-ik

国人做的直接打包可用Ready to Fly

https://github.com/medcl/elasticsearch-rtf

4. Java客户端

Java REST Client提供低级别和高级别两种,高级别在低级别的基础上,提供了更特别的接口封装。低级别的实际上就是一个curl,低级别的jar包大小只有36k,还依赖了http请求等其它包,总数大概2M。高级别还是全部东西往里面整,10多m了,还不如直接用low lelve算了

第三方客户端

文档更新时间: 2018-11-12 17:38   作者:nick