首先,我啰嗦几句,毕竟在这里能够顺便插条广告:我的第一篇博客文章即将在“开源中国”诞生!我为自己鼓掌!(因为这个世界缺少掌声,所以我们必须学会为自己鼓掌)
Elasticsearch,我接触了好几天,对网络上的很多杂牌文档不敢苟同。一篇有实际价值的文档,正如我的同事所说的一样,模仿一次、测试一次、在测试一次,如若能够顺利通过,则最后写出的文档才是一篇百分百值得信赖的文档。当然,不排除每个人的情况不同而差生的意外事件,就好像我每次根据网络文档去试验都能“成功”遇到很多大大小小的错误一样。但是,我不会气馁,因为换一个角度来说,这是上天赐予我的机会——让我在挫折中成长,以后就不会在遇到问题出现的时候措手不及了,因为我正年轻!
追根到底,网络上的文档不全面的原因还是因为以下几点:
第一、大多数人都喜欢复制黏贴或是直接转载变为自己的“作品”(这点是国内IT技术前进缓慢的障碍之一);
第二、得到网络上的“标准"文档后,“模仿”一遍后顺利呈现想要的效果,并且从未有机会走上满是”荆棘“的道路(这种在温室里成长的花骨朵一旦暴露在室外,可以想象到后果);
第三、国内的IT技术行业起步慢,国外的大牛精辟指导又不那么的”容易“传播到我们的国内(这个原因估计很多IT爱好者都很清楚,近几年有道墙筑起来之后我们就得花上更多的钱去翻墙了,别问我是什么或为什么,长这么大,我爸妈从没告诉过我)
================== 你↑我↓,骑着猪的公主 ==================
(有种运动的完美全程是这样划分的:第一个阶段美之曰”前戏“,第二个阶段谓其为”过程“,第三个阶段美之曰”高潮“。在这里,我的博客文章就用这三个阶段来向大家展示成果)
前戏:
系统:Linux (本本章环境是Debian7)
过程:
安装JAVA去支持ES :
1.解压:
tar zxf jdk-8u91-linux-x64.tar.gz -C /usr/lib/jvm/
2.下面配置环境变量,使用vim /etc/profile命令编辑,在底部加入以下命令:
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
3.使用source执行配置文件中的命令:
source /etc/profile
注:Elasticsearch安装至少需要Java 7的支持。如需了解Java的情况,可以到oracle的官网找相关的资料。所以,请在我们安装Elasticsearch前,请检查我们的Java版本运行:
java -version
安装elasticsearch :
下载页=> 官网:http://www.elasticsearch.com/
1.解压:
tar zxf elasticsearch-2.3.3.tar.gz -C /usr/local/
2.保证非ROOT用户对elasticsearch目录拥有修改的权限:chown -R situtao elasticsearch-2.3.3/
3.后台运行启动ES:bin/elasticsearch -d
注:默认情况下,Elasticsearch使用9200端口提供的REST API。该端口是可配置的。
4.检测:
在本机访问 curl 127.0.0.1:9200
{
"name" : "Vashti", //节点名是随机生成的,可自定义
"cluster_name" : "elasticsearch",
"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"
}
高潮:
配置篇:
ElasticSearch的基本配置(这部分配置可以不理会,取默认值)
编辑文件${ESROOTPATH}/config/elasticsearch.yml
cluster.name:集群名称,es可以自我发现,拥有相同集群名字的ES会构成集群
node.name:节点名称,当前节点的名字,唯一性
node.master:是否允许当前节点成为master //设置为true,则能在master宕掉后使从节点自动参与选举
node.data:是否允许当前节点存储数据
index.number_of_shards:一个索引默认的shard数量 //自定义增加配置,默认是5个主分片
ndex.number_of_replicas:一个索引默认的副本数量 //自定义增加配置,默认是1个副分片
path.data:数据存储位置
path.logs :日志存储位置
bootstrap.mlockall:是否只使用内存(不使用swap)
PS:避免脑裂现象,用到的一个参数是:discovery.zen.minimum_master_nodes。这个参数决定了要选举一个Master需要多少个节点(最少候选节点数)。默认值是3。根据一般经验这个一般设置成 N/2 + 1,N是集群中节点的数量,例如一个有3个节点的集群,minimum_master_nodes 应该被设置成 3/2 + 1 = 2(向下取整)。主节点的个数最好是奇数个,并且不少于3个;但是会带来一个问题,如必须至少一半以上的主节点是可用的,如果不能满足这个要求,则系统就会崩溃。
我对ES的集群配置如下 ==>:
cluster.name: situtao-JQ //集群名要相同才能划分到同一个集群内
node.name: node-2 //节点名具有唯一性,每个节点名字都应独立
network.host: 192.168.3.254 //此处填写的是本机IP或VIP(具体根据自己的需要决定,也可以本机IP+VIP,IP间使用逗号","分隔开)
discovery.zen.ping.unicast.hosts: [192.168.3.81, 192.168.3.186, 192.168.3.254] //设置新节点被启动时能够发现的主节点列表(主要用于不同网段机器连接)
discovery.zen.minimum_master_nodes: 2
index.number_of_shards: 3
index.number_of_replicas: 1
index.cache.field.type: soft //默认类型为resident, 字面意思是常驻(居民), 一直增加,直到内存 耗尽。 改为soft就是当内存不足的时候,先clear掉 占用的,然后再往内存中放。设置为soft后,相当于设置成了相对的内存大小。resident的话,除非内存够大
discovery.zen.fd.connect_on_network_disconnect : true
自动(被)发现配置:
discovery.zen.initial_ping_timeout : 30s
discovery.zen.fd.ping_interval : 2s
discovery.zen.fd.ping_retries : 10
绑定本地IP,发送本地数据:
设置集群名称:
设置节点名称:
<== 集群配置END(注:)
重启ES服务,通过浏览器可以访问该机器上的ES服务:
安装监控插件:
1.安装elasticsearch-head :下载页面 ==>
http://mobz.github.io/elasticsearch-head/
安装方法:
安装命令:
./bin/plugin install mobz/elasticsearch-head
2.安装elasticsearch-kopf :
安装命令:
./bin/plugin install lmenezes/elasticsearch-kopf
监控运用实例:
重启ES服务,通过浏览器打开查看(以Head监控插件为例):(黑色实心表示此节点用于存储数据,星型代表主节点,圆点代表从节点)
1.操作,新建索引
2.返回ES概览查看:
安装ik分词器:
NO1:安装开发环境maven:
下载:(官网)
wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
安装:
确认JAVA安装完成:java -version
解压maven源码包:tar zxvf apache-maven-3.3.9-bin.tar.gz -C /usr/local/
添加环境变量:vim /etc/profile
export PATH=/usr/local/apache-maven-3.3.9/bin:$PATH
source /etc/profile 执行文件中的命令
验证:mvn --version
NO2:安装ik分词器:
版本对应:
IK version ES version
master 2.3.1 -> master
1.9.3 2.3.3
1.9.0 2.3.0
1.8.1 2.2.1
1.7.0 2.1.1
1.5.0 2.0.0
1.2.6 1.0.0
1.2.5 0.90.x
1.1.3 0.20.x
1.0.0 0.16.2 -> 0.19.0
下载:git clone https://github.com/medcl/elasticsearch-analysis-ik
手动安装过程:
cd elasticsearch-analysis-ik
mvn clean
mvn compile
mvn package
执行完以上命令会在当前目录生 target/releases/elasticsearch-analysis-ik-1.9.3.zip文件
创建ik插件目录:mkdir /usr/local/apache-maven-3.3.9/plugin/ik
cp target/releases/elasticsearch-analysis-ik-1.9.3.zip /usr/local/apache-maven-3.3.9/plugins/ik
cd /usr/local/apache-maven-3.3.9/plugins/ik
unzip elasticsearch-analysis-ik-1.9.3.zip
编辑ES配置文件,在末尾加入一行配置:
vim /usr/local/apache-maven-3.3.9/config/elasticsearch.yml
index.analysis.analyzer.ik.type : ik
测试IK的效果:
1.创建索引:
curl -XPUT 192.168.3.81:9200/new_index -d '
{
"mappings": {
"tags": {
"properties": {
"tags": {
"type":"string",
"index":"not_analyzed"
}
}
}
}
}'
2.返回测试结果:
curl 'http://192.168.3.81:9200/new_index/_analyze?analyzer=ik&pretty=true' -d '
{
"text":"世界如此之大"
}'
=>显示结果:
{
"tokens" : [ {
"token" : "世界",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 0
}, {
"token" : "如此之",
"start_offset" : 2,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 1
}, {
"token" : "如此",
"start_offset" : 2,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 2
}, {
"token" : "之大",
"start_offset" : 4,
"end_offset" : 6,
"type" : "CN_WORD",
"position" : 3
} ]
}
3.添加数据:
curl -XPOST http://192.168.8.7:9200/new_index/fulltext/1 -d'
{"content":"美国留给伊拉克的是个烂摊子吗"}'
curl -XPOST http://192.168.8.7:9200/new_index/fulltext/2 -d'
{"content":"公安部:各地校车将享最高路权"}'
curl -XPOST http://192.168.8.7:9200/new_index/fulltext/3 -d'
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}'
curl -XPOST http://192.168.8.7:9200/new_index/fulltext/4 -d'
{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}'
4.打开浏览器访问:
4.1 概览:
4.2 数据浏览:
4.3 基本查询:
4.4 复合查询:
{"query":{"function_score":{"query":{"multi_match":{"query":"如今的投资者只能以“呵呵”二字默认","type":"most_fields","fields":["title","content"]}},"functions":[{"field_value_factor":{"field":"hit","modifier":"log1p","factor":0.1}},{"field_value_factor":{"field":"reply","modifier":"log1p","factor":0.5}}],"boost_mode":"sum","max_boost":2}},"highlight":{"fields":{"pre_tags":["<tag1>","<tag2>"],"post_tags":["</tag1>","</tag2>"],"content":{},"title":{}}},"from":0,"size":100}
本博客仅为记录自己的学习,更多文献出自于经过我验证的网络,更多详细分析我会在后面的博文中持续的更新!(欢迎点评和给我更好的建议)