【理论部分】
一、什么是Elasticsearch?
一个采用Restful API标准的高扩展性和高可用性的实时数据分析的全文搜索工具。
二、Elasticsearch的用途
i) Github
“Github使用Elasticsearch搜索20TB的数据,包括13亿的文件和1300亿行的代码”
这个不用介绍了吧,码农们都懂的,Github在2013年1月升级了他们的代码搜索,由solr转为elasticsearch,目前集群规模为26个索引存储节点和8个客户端节点(负责处理搜索请求),详情请看官方博客https://github.com/blog/1381-a-whole-new-code-search
Mozilla公司以火狐著名,它目前使用 WarOnOrange 这个项目来进行单元或功能测试,测试的结果以 json的方式索引到elasticsearch中,开发人员可以非常方便的查找 bug。
Socorro是Mozilla 公司的程序崩溃报告系统,一有错误信息就插入到 Hbase和Postgres 中,然后从 Hbase中读取数据索引到elasticsearch中,方便查找。
三、Elasticsearch 名词解释
- Index:Elasticsearch用来存储数据的逻辑区域,它类似于关系型数据库中的db概念。一个index可以在一个或者多个shard上面,同时一个shard也可能会有多个replicas。(必须小写)
- Document:Elasticsearch里面存储的实体数据,类似于关系数据中一个table里面的一行数据。
- Document type:为了查询需要,一个index可能会有多种document,也就是document type,但需要注意,不同document里面同名的field一定要是相同类型的。相当于数据库里的一个表。 (区分大小写,且里面的field也区分大小写)
- Document id : 唯一,相当于数据库主键。
- Mapping:存储field的相关映射信息,不同document type会有不同的mapping。
ii) 在服务层面主要有:
- Node: 一个server实例。
- Cluster:多个node组成cluster。
- Shard:数据分片,一个index可能会存在于多个shards,不同shards可能在不同nodes。
- Replica:shard的备份,有一个primary shard,其余的叫做replica shards。
【实践部分】
四、Elasticsearch 的安装部署启动
[boss@localhost ~]$ mkdir elasticesearch
[boss@localhost ~]$ cd elasticesearch/
[boss@localhost elasticesearch]$ tar xzf elasticsearch-2.3.5.tar.gz
[boss@localhost elasticesearch]$ cd bin/
[boss@localhost bin]$ ./elasticsearch
五、Elasticsearch 目录、配置信息解释
i) 安装的目录布局如下:
Type |
Description |
Default Location |
Setting |
home |
elasticsearch 安装目录 | path.home | |
bin |
二进制脚本,包括elasticsearch启动节点 | {path.home}/bin | |
conf |
配置文件路径,包含elasticsearch.yml | {path.home}/config | path.conf |
data |
在节点上每个索引/碎片的数据文件的位置。可以有多个目录。 | {path.home}/data | path.data |
work |
零时文件目录(工作目录) | {path.home}/work | path.work |
logs |
日志文件目录 | {path.home}/logs | path.logs |
如果有多个数据目录,可以允许使用数据分拆技术,将数据能够按照设置放在不同的磁盘上。这个分拆原来是很简单的,只是保证一个文件完整的存在一个地方,具体是如果选择存在那个磁盘上是通过 index.store.distributor来配置的:
- least_used(默认):总是选择可用空间最大的目录。
- random:随机选择的目录。选择一个特定的目录的概率,是与这个目录中可用空间量成正比。
cluster.name: elasticsearch天然具备集群能力,所以这里就有一个集群名称配置,默认为elasticsearch,最好修改下。
node.name: 节点名称,也就是集群中的各个节点的名称,也需要配置,方便以后管理和java api开发
network.host: 允许访问的host,可以是ipv4也可以是ipv6形式,在es2.x下如果不配,那么就只能localhost访问了。
http.port: http端口号,用于restful、插件的访问端口,默认9200,不能重复
transport.tcp.port: 通讯端口,java api 访问的就是这个端口,默认9300,不能重复
discovery.zen.ping.unicast.hosts: 这个是集群启动的时候,默认发现的主机列表,然后通过这里的host再去发现别的节点,需要至少配置一个,不然好像有点问题,我在集群搭建的时候就因为没配置遇到一些意外情况。
discovery.zen.minimum_master_nodes: 最小的master选举人数,默认为2,这种形式计算(total number of nodes /2+1)
discovery.zen.ping.multicast.enabled: 自动发现节点开关,如果为false,则新加入的节点不会被发现。
discovery.zen.ping.timeout: 自动发现超时时间。
六、Elasticsearch插件安装
target/releases/elasticsearch-analysis-ik-{version}.zip
到 your-es-root/plugins/ik
4、重启elasticsearch。这点很重要,我就因为没有重启折腾了一上午。
编译安装:
cd F:\software\elasticsearch-analysis-lc-pinyin-dev_2.2.2\elasticsearch-analysis-lc-pinyin
mvn package
配置使用:
curl -XPUT http://localhost:9200/addr
curl -XPOST http://localhost:9200/addr/std/_mapping -d'
{
"std": {
"properties": {
"detail_name": {
"type": "string",
"analyzer": "lc_index",
"search_analyzer": "lc_search",
"fields": {
"cn": {
"type": "string",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
}
}
},
"door_name": {
"type": "string",
"analyzer": "lc_index",
"search_analyzer": "lc_search",
"fields": {
"cn": {
"type": "string",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
}
}
}
}
}
}
'

#!/bin/sh # This example is a template to connect to Oracle # The JDBC URL and SQL must be replaced by working ones. DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" bin=${DIR}/../bin lib=${DIR}/../lib JAVA_HOME="/opt/java/jdk1.8.0_101" echo ' { "type" : "jdbc", "jdbc" : { "url" : "jdbc:oracle:thin:@//***.***.***.***:1521/***", "connection_properties" : { "oracle.jdbc.TcpNoDelay" : false, "useFetchSizeWithLongColumn" : false, "oracle.net.CONNECT_TIMEOUT" : 10000, "oracle.jdbc.ReadTimeout" : 50000 }, "user" : "pboss", "password" : "******", "sql" : "select std_addr_id as \"_id\",std_addr_id as \"std_addr_id\", name as \"door_name\", detail_name as \"detail_name\" from addr_std_addr", "index" : "addr", "type" : "std", "elasticsearch" : { "cluster" : "alpha-application", "host" : "10.10.100.104", "port" : 9300 }, "max_bulk_actions" : 20000, "max_concurrent_bulk_requests" : 10, "index_settings" : { "index" : { "number_of_shards" : 1, "number_of_replica" : 0 } } } } ' | ${JAVA_HOME}/bin/java \ -cp "${lib}/*" \ -Dlog4j.configurationFile=${bin}/log4j2.xml \ org.xbib.tools.Runner \ org.xbib.tools.JDBCImporter
"interval": "1800", 这里是同步数据的频率 1800s,半小时,可以按需要设成 1s或其它 "schedule" : "0 0/60 0-23 ? * *", 同步数据任务 60分钟一次 "flush_interval" : "5s", 刷新间隔为5S