一. 为什么要用ES
1.分布式搜索、分析
2.近实时的存储数据、查询数据
3.基于倒排索引
4.解决原生Lucene的不足,优化Lucene的调用方式
5.可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据
6.每个字段都建立的索引
二.对比传统数据库
-
关系数据库 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns)
-
Elasticsearch ⇒ 索引(Index) ⇒ 类型(type) ⇒ 文档(Docments) ⇒ 字段(Fields)
三.java操作Elasticsearch
4种:TransportClient、RestClient、SpringData-Es、Elasticsearch-SQL。
1.TransportClient 已经弃用
2.RestClient
首先添加依赖如下:
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.2.0</version>
</dependency>
springboot的yml的配置为:
# Elasticsearch配置
elasticsearch:
hostname: 127.0.0.1
port: 9200
这里讲一下9200与9300的区别:
9200:是es节点与外部通讯使用的端口,它是http协议的RESTful接口(各种CRUD操作都是走的该端口,如查询: http://localhost:9200/user/_search)。
9300:是es节点之间通讯使用的端口,它是TCP通讯端口,集群之间和TCPclient都是使用的是它。
配置客户端实例:
new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1","9200","http")));
spring中如下:
@Bean
public RestHighLevelClient restHighLevelClient() {
// 如果有多个从节点可以持续在内部new多个HttpHost,参数1是IP,参数2是端口,参数3是通信协议
return new RestHighLevelClient(RestClient.builder(new HttpHost(hostname, port, "http")));
}
使用方式:
===========================================添加文档===============================================
1.创建IndexRequest
IndexRequest indexRequest = new IndexRequest(“索引名称”);
2.定义source
String source = JSON.toJSONString(数据对象);
3.indexrequest添加source原始数据
indexRequest.source(source,XContentType.JSON);
4.创建索引
IndexResponse indexResponse = restHighLevelClient.index(indexRequest,RequestOption.DEFAULT);
==========================================查询文档================================================
1.创建 SearchSourceBuilde
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
2.分页
searchSourceBuilder.from((page - 1) * rows);
searchSourceBuilder.size(rows);
3.查询条件
QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery(keyword, "name", "desc");
searchSourceBuilder.query(queryBuilder);
4.排序,根据ID倒叙
searchSourceBuilder.sort("id", SortOrder.DESC);
5.创建searchRequest
SearchRequest searchRequest = new SearchRequest();
searchRequest.source(searchSourceBuilder);
7.查询ES
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
8.返回结果集
SearchHits hits = searchResponse.getHits();
9.遍历封装的数据
SearchHit[] searchHits = hits.getHits();
for (SearchHit searchHit : searchHits) {
bookDtoList.add(JSON.parseObject(searchHit.getSourceAsString(), BookDto.class));
}
=========================================根据条件id查询==========================================
1.创建GetRequest
GetRequest getRequest = new GetRequest(Constant.INDEX, id);
2.查询ES
GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
3.返回数据
BookDto bookDto = JSON.parseObject(getResponse.getSourceAsString(), BookDto.class);
===========================================修改文档===============================================
UpdateRequest updateRequest = new UpdateRequest(Constant.INDEX, bookDto.getId().toString());
updateRequest.doc(JSON.toJSONString(bookDto), XContentType.JSON);
// 操作ES
UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
============================================删除文档==============================================
DeleteRequest deleteRequest = new DeleteRequest(Constant.INDEX, id);
// 操作ES
DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
============================================结束=================================================