一、ElasticSearch安装
从ES 7.x版本开始,其发行的安装包中就已经内置了JDK。如果用户对JDK有独特的要求,可以修改其启动脚本进行依赖配置。
从Download Elasticsearch | Elastic下载,解压安装文件,进入到解压后到文件夹,我们可以看到:
目录 | 作用 |
bin | 存放ES启动、关闭等脚本文件 |
conf | ES配置文件所在的目录 |
jdk | ES自带的JDK目录 |
lib | ES运行所需要的jar目录 |
logs | 存储ES的运行日志 |
modules | 存储ES已安装的模块 |
plugins | 存储ES已安装的插件 |
出于安全性考虑,ES不允许用root账户启动,应创建其他账户启动ES。在默认情况下,配置文件中ES进程占用的内存为1GB。如果计算机的内存较小,需要更改config/jvm.options配置文件,修改其中的-Xms和-Xmx参数值到合适的值即可。
ES启动:
- 当前会话启动:bin/elasticsearch
- 后台运行启动:bin/elasticsearch -d
- docker 启动:docker run -d -p 127.0.0.1:9200:9200 -p 127.0.0.1:9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.13.2
查看日志:tail -f logs/elasticsearch.log
当ES启动后,在其安装目录下会增加一个data目录,该目录主要用于存储索引数据文件。
启动完之后,我们可以通过curl http://127.0.0.1:9200 进行验证,其结果如下:
{
"name" : "7f78345d924a",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "_NTwWUjwT2OHa9s2zHWXfw",
"version" : {
"number" : "7.13.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "4d960a0733be83dd2543ca018aa4ddc42e956800",
"build_date" : "2021-06-10T21:01:55.251515791Z",
"build_snapshot" : false,
"lucene_version" : "8.8.2",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
其中:
- name为当前ES的实例名称,默认取值是当前服务器的主机名。
- cluster_name为集群的名称,该项在配置文件中的默认值即为elasticsearch
当在同一个网络中部署多个ES集群时,将依靠cluster_name的值作为集群的唯一标识,各节点只有和集群下的其他节点的cluster_name值一致才能加入该集群中。在这种情况下,不同的集群节点需要将cluster_name的值定义为不同的名称。version内为当前集群版本及使用的Lucene组件等版本信息。
集群模式安装
集群模式可以增强ES集群的服务性能或提升其高可用性,假设这3台计算机的IP地址分别为192.168.0.1、192.168.0.2和192.168.0.3,名称分别为es1、es2和es3,需要在这3台计算机上创建除root外的用户进行集群的搭建。
修改3台计算机的config/elasticsearch.yml文件。
在es1上需要修改的文件内容如下:
在es2上需要修改的文件内容如下:
在es3上需要修改的文件内容如下:
更改各节点配置后,可以按照任意顺序在3台计算机上运行bin/elasticsearch -d命令启动实例
执行curl http://192.168.0.1:9200/_cat/nodes?v命令,可以查看集群节点信息:
返回的信息中主要描述了当前集群中各个节点的IP地址及CPU的内存负载情况,另外还包括节点角色信息,其中,es1目前是集群中的master节点。ES集群中的master节点是由集群自动选举完成指派的,不需要额外指定。当然,如果用户对某些节点的角色有特殊的要求,可以更改config/elasticsearch.yml文件中的node.master或者node.data选项来完成配置。
二、创建索引
比如我们建立一个旅馆的索引hotel:
- 对于旅馆标题来说,需要按照用户输入的关键词进行模糊搜索,因此应该定义成文本(text)型;
- 对于所属城市来说,只需进行相等与否的判断,定义成普通的关键词类型(keyword)即可;
- 对于房价来说,只需进行大小比较的判断,因此定义成数值中的双精度浮点型。
假设使用默认的分片数和副本数,整体的索引创建语句如下:
curl -H ‘Content-Type: application/json’ -XPUT http://127.0.0.1:9200/hotel -d ’{
“mappings”:{
“properties”:{
“title”:{“type”:”text”},
“city”:{“type”:”keyword”},
“price”:{“type”:”double”}
}
}
}’
Content-Type:application/json描述的是本次请求向目标URL传递JSON形式的参数
-XPUT是告诉服务方本次的请求类型为PUT
URL最后面的hotel就是将要创建的索引名称
为了简单起见,大家可以使用kibana的Dev Tools进行语句的操作,比如:
PUT /hotel
{
“mappings”:{
“properties”:{
“title”:{“type”:”text”},
“city”:{“type”:”keyword”},
“price”:{“type”:”double”}
}
}
}
三、写入文档
在索引中创建了一条ID为001的文档:
POST /hotel/_doc/001
{
"title":"java旅馆",
"city":"深圳",
"price":50.00
}
四、根据_id搜索文档
GET /hotel/_doc/001
查询返回的结果中包括搜索的一些元数据,如是否找到、索引名称、文档ID值、文档版本等,在_source中展示了命中的文档的原始数据
五、根据一般字段搜索文档
在ES中进行搜索时需要用到query子句,其请求形式如下:
GET /${index_name}/_search
{
"query":{
...
}
}
query子句可以按照需求填充查询项。假设按照城市进行搜索,把旅馆文档搜索出来。因为只需要进行文本是否相等的判断,所以需要用到term搜索:
GET /hotel/_search
{
"query":{
"term":{
"price":{"value":50.00}
}
}
}
六、根据文本字段搜索文档
如果要对文本进行模糊匹配并给出匹配分数,可以使用match搜索对某个字段进行模糊匹配,比如按照标题进行模糊搜索:
GET /hotel/_search
{
"query":{
"match":{"title":"java"}
}
}
此时ES对结果进行了打分计算,此处使用的是对文本打分计算的算法