准备
jdk1.8
elasticsearch 5.5.2
springboot 1.5.6RELEASE
maven 3.5.0
node.js 8.11.4
postman工具
jdk,maven,node,postman的安装就不管了
1、安装elasticsearch
下载压缩包
到elastic官网:https://www.elastic.co/cn/downloads/past-releases下载
我这里下载的是5.5.2windows版本的
修改配置文件
解压后,修改config文件夹下的配置文件jvm.options,默认jvm的内容是2g,我修改为256m,测试嘛我就搞小点,不改也行,只要电脑的内存够用就行
修改之后
启动
在bin目录下,点击elasticsearch.bat文件启动,看到关键字started就是启动成功了
elastic默认端口是9200,到浏览器访问localhost:9200
2、elasticsearch的head插件(es界面)
下载
下载地址:https://github.com/mobz/elasticsearch-head
启动
进入elasticsearch-head-master文件夹
下载依赖: npm install
启动:npm run start
访问localhost:9100
结果是未连接,暂时不知道什么原因,以后知道了再补充上,但是建立起elasticsearch的集群后他就连接成功了,就先放着了,接着看安装elastic的集群搭建
3、elasticsearch集群安装
主节点
修改配置文件elasticsearch.yml,将下面这些配置添加进去
#指定集群的名称
cluster.name: syf
#节点名称
node.name: master
#是不是主节点
node.master: true
node.attr.rack: r1
#最大集群节点数
node.max_local_storage_nodes: 3
#网关地址
network.host: 127.0.0.1
#端口
http.port: 9200
#内部节点之间沟通端口
transport.tcp.port: 9300
# 开启安全防护(启用跨域访问)
http.cors.enabled: true
http.cors.allow-origin: "*"
#时间放长,防止脑裂
discovery.zen.ping_timeout: 120s
client.transport.ping_timeout: 60s
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
#配置有机会参与选举为master的节点
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]
#elasticSearch服务器的数据目录和日志目录,可以自行新建后配置路径使elasticSearch服务启动后将运行数据和日志生成到指定目录下
path.data: E:\syf\down\elasticsearch-5.5.2\data
path.logs: E:\syf\down\elasticsearch-5.5.2\logs
其中path.data和path.logs换成你自己的路径,
从节点
将主节点复制两份作为两个从节点
分别修改elasticsearch.yml配置文件
#指定集群的名称
cluster.name: syf
#节点名称
node.name: slave1
#是不是主节点
node.master: false
node.attr.rack: r1
#最大集群节点数
node.max_local_storage_nodes: 3
#网关地址
network.host: 127.0.0.1
#端口
http.port: 9201
#内部节点之间沟通端口
transport.tcp.port: 9301
# 开启安全防护(启用跨域访问)
http.cors.enabled: true
http.cors.allow-origin: "*"
#时间放长,防止脑裂
discovery.zen.ping_timeout: 120s
client.transport.ping_timeout: 60s
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
#配置有机会参与选举为master的节点
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]
#elasticSearch服务器的数据目录和日志目录,可以自行新建后配置路径使elasticSearch服务启动后将运行数据和日志生成到指定目录下
path.data: E:\syf\down\elasticsearch-5.5.2.1\data
path.logs: E:\syf\down\elasticsearch-5.5.2.1\logs
#指定集群的名称
cluster.name: syf
#节点名称
node.name: slave2
#是不是主节点
node.master: false
node.attr.rack: r1
#最大集群节点数
node.max_local_storage_nodes: 3
#网关地址
network.host: 127.0.0.1
#端口
http.port: 9202
#内部节点之间沟通端口
transport.tcp.port: 9302
# 开启安全防护(启用跨域访问)
http.cors.enabled: true
http.cors.allow-origin: "*"
#时间放长,防止脑裂
discovery.zen.ping_timeout: 120s
client.transport.ping_timeout: 60s
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
#配置有机会参与选举为master的节点
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]
#elasticSearch服务器的数据目录和日志目录,可以自行新建后配置路径使elasticSearch服务启动后将运行数据和日志生成到指定目录下
path.data: E:\syf\down\elasticsearch-5.5.2.2\data
path.logs: E:\syf\down\elasticsearch-5.5.2.2\logs
启动集群
依次启动三个节点,再访问localhost:9100,直接访问可能还得不到效果,需要等一会儿,这里我在搭建的时候等了大概3分钟,所有节点才启动了完了,
4、elasticsearch的CRUD
直接使用head插件进行操作的话,似乎只能进行创建索引这样的操作,所以我们使用工具,postman,elasticsearch提供了restful的api,postman是一个调试接口的利器
在进行crud操作前,先说明几个概念
概念 | 描述 |
---|---|
索引(index) | 可以简单理解为数据库中的 库(database) |
类型(type) | 就相当于数据库中 表(table) |
文档(doc) | 就相当于一条数据 |
分片 | es创建索引时默认5个分片,5个分片共同存放一个索引 |
备份 | es默认一个分片一个备份 |
打开postman创建一个book索引,其中给一个novel类型并定义文档的结构
创建索引的json
{
"settings":{
"number_of_shards":5,
"number_of_replicas":1
},
"mappings":{
"novel":{
"properties":{
"title":{
"type":"text"
},
"price":{
"type":"integer"
},
"date":{
"type":"date",
"format":"yyyy-MM-dd"
}
}
}
}
}
下图表示成功
访问localhost:9100
其中细线的代表备份,比如细线0为粗线0的备份,以此类推
增加一个文档
修改文档
书名成功修改为了西游记
获取文档
删除文档
5、springboot整合elasticsearch
创建一个maven项目
目录结构
pom依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
</parent>
<properties>
<elasticsearch.version>5.5.2</elasticsearch.version>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7</version>
</dependency>
</dependencies>
Config.java
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class Config {
@SuppressWarnings("resource")
@Bean
public TransportClient getTransportClient() throws UnknownHostException{
InetSocketTransportAddress node = new InetSocketTransportAddress(
InetAddress.getByName("localhost"),
9300//9300是elastic的transport使用的端口
);
Settings settings = Settings.builder().put("cluster.name","syf").build();
TransportClient client = new PreBuiltTransportClient(settings);
client.addTransportAddress(node);
return client;
}
}
BookController.java
@RestController
@RequestMapping("/book")
public class BookController {
@Autowired
private TransportClient client;
@RequestMapping("/novel/get")
public Object get(String id){
GetResponse result = client.prepareGet("book","novel",id).get();
return result.getSource();
}
@RequestMapping("/novel/add")
public Object add(String title,String price,String date){
try {
XContentBuilder content = XContentFactory.jsonBuilder()
.startObject()
.field("title",title)
.field("price",price)
.field("date",date)
.endObject();
IndexResponse result = client.prepareIndex("book", "novel").setSource(content).get();
return result.getResult();
} catch (Exception e) {
// TODO: handle exception
}
return null;
}
@RequestMapping("/novel/delete")
public Object delete(String id){
DeleteResponse result = client.prepareDelete("book", "novel", id).get();
return result.getResult();
}
@RequestMapping("/novel/update")
public Object update(String id,String title,String price,String date){
UpdateRequest update = new UpdateRequest("book", "novel", id);
try {
XContentBuilder content = XContentFactory.jsonBuilder().startObject();
content.field("title", title).field("price",price).field("date",date);
content.endObject();
update.doc(content);
UpdateResponse result = client.update(update).get();
return result.getResult();
} catch (Exception e) {
// TODO: handle exception
}
return null;
}
@RequestMapping("/novel/query")
public Object query(String title,String price){
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
if(title!=null){
boolQuery.must(QueryBuilders.matchQuery("title", title));
}
SearchRequestBuilder search = client.prepareSearch("book").setTypes("novel")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(boolQuery);
List<Map<String, Object>> result = new ArrayList<Map<String,Object>>();
SearchResponse response = search.get();
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
result.add(hit.getSource());
}
return result;
}
}
springboot默认监听8080,增删改查自己测试,我测试过是可以的
完整代码下载地址:https://gitee.com/shyf2019/springboot_elasticsearch