引入elasticsearch 依赖
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.8.0</version>
</dependency>
<!-- elasticsearch的客户端 -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.8.0</version>
</dependency>
这边没有采用 spring整合包,原因是版本控制问题, 如果项目需要按如下方式引入
<!--spring整合elasticsearch包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
然后进行配置文件配置即可
spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300
spring.data.elasticsearch.repositories.enabled=true
配置类,写好端口,协议
/**
* @author lsc
* <p> </p>
*/
@Configuration
public class ElasticSearchConfig {
@Bean
public RestHighLevelClient esRestClient() {
RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200, "http"));
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);
return restHighLevelClient;
}
}
实体类
/**
* @author lsc
* <p> </p>
*/
public class Course {
private Long id;
private String name;
private BigDecimal price;
private String description;
// 省略set / get
}
在 索引操作中只是 请求不同,其它代码均类似;
@Autowired
RestHighLevelClient restHighLevelClient;
@Test
public void createIndex() throws IOException {
// 创建索引 ,请求对象
CreateIndexRequest request = new CreateIndexRequest("course");
// 发送请求,获取响应
CreateIndexResponse response = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
boolean acknowledged = response.isAcknowledged();
// 响应状态
System.out.println("是否创建成功: " + acknowledged);
// 关闭客户端连接
restHighLevelClient.close();
}
输出
是否创建成功: true
@Test
public void viewIndex() throws IOException {
// 查看索引请求对象
GetIndexRequest request = new GetIndexRequest("course");
// 发送请求取响应
GetIndexResponse response = restHighLevelClient.indices().get(request, RequestOptions.DEFAULT);
Map<String, MappingMetadata> mappings = response.getMappings();
// 响应状态
System.out.println(": " + mappings);
// 关闭客户端连接
restHighLevelClient.close();
}
输出
: {course=org.elasticsearch.cluster.metadata.MappingMetadata@a78933ee}
@Test
public void delIndex() throws IOException {
// 查看索引请求对象
DeleteIndexRequest request = new DeleteIndexRequest("course");
// 发送请求取响应
AcknowledgedResponse response = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
boolean acknowledged = response.isAcknowledged();
// 响应状态
System.out.println("是否删除成功: " + acknowledged);
// 关闭客户端连接
restHighLevelClient.close();
}
输出
是否删除成功: true
创建文档步骤如下
@Autowired
RestHighLevelClient restHighLevelClient;
@Test
public void createDoc() throws IOException {
// 请求对象
IndexRequest request = new IndexRequest();
// 设置 索引 和id
request.index("course").id("1");
// 参数
Course course = new Course();
course.setName("java");
course.setPrice(new BigDecimal("1800"));
course.setDescription("不贵,火爆");
Gson gson = new Gson();
String json = gson.toJson(course);
// 添加文档,格式为JSON
request.source(json, XContentType.JSON);
// 发送请求,获取响应对象
IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
System.out.println("结果:" + response.getResult());
}
输出
结果:CREATED
RESTFUL API查看结果
批量新增文档
@Test
public void createDocBulk() throws IOException {
//创建批量新增请求对象
BulkRequest request = new BulkRequest();
request.add(new IndexRequest().index("course").id("2").source(XContentType.JSON, "name", "java"));
request.add(new IndexRequest().index("course").id("3").source(XContentType.JSON, "name", "python"));
request.add(new IndexRequest().index("course").id("4").source(XContentType.JSON, "name", "go"));
//发送请求,获取响应对象
BulkResponse responses = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
System.out.println("结果:" + responses.getTook());
}
结果
结果:13ms
修改文档,指定索引,id,然后只需要将修改的内容放入map,发送请求;
@Test
public void updateDoc() throws IOException, JSONException {
// 请求对象
UpdateRequest request = new UpdateRequest();
// 设置 索引 和id
request.index("course").id("1");
// 参数
// 添加文档,格式为JSON
HashMap<String, Object> map = new HashMap<>();
map.put("name","python");
request.doc(map);
// 发送请求,获取响应对象
UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
System.out.println("结果:" + response.getResult());
}
结果
结果:UPDATED
@Test
public void viewDoc() throws IOException {
//创建请求对象
GetRequest request = new GetRequest().index("course").id("1");
//发送请求,获取响应对象
GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
System.out.println("结果:"+ response.getSource());
}
结果
结果:{price=1800, name=python, description=不贵,火爆}
@Test
public void delDoc() throws IOException {
//创建请求对象
DeleteRequest request = new DeleteRequest().index("course").id("1");
//发送请求,获取响应对象
DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
System.out.println(response.getResult());
}
结果
DELETED
批量删除文档
@Test
public void delDocBulk() throws IOException {
//创建请求对象
BulkRequest request = new BulkRequest();
request.add(new DeleteRequest().index("course").id("2"));
request.add(new DeleteRequest().index("course").id("3"));
request.add(new DeleteRequest().index("course").id("4"));
//发送请求,获取响应对象
BulkResponse responses = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
System.out.println("took:" + responses.getTook());
}
结果
took:12ms
执行之前的批量新增操作后执行此步骤
@Test
public void selectAll() throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("course");
// 构建请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 查询所有数据
sourceBuilder.query(QueryBuilders.matchAllQuery());
request.source(sourceBuilder);
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
// 查询结果
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
//输出每条结果信息
System.out.println(hit.getSourceAsString());
System.out.println("------华丽的分割线-----");
}
}
输出
{"name":"java"}
------华丽的分割线-----
{"name":"python"}
------华丽的分割线-----
{"name":"go"}
------华丽的分割线-----
根所有查询文档基本一样,改变查询条件即可
@Test
public void selectMatch() throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("course");
// 构建请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 查询匹配数据
sourceBuilder.query(QueryBuilders.matchQuery("name","java"));
request.source(sourceBuilder);
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
// 查询结果
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
//输出每条结果信息
System.out.println(hit.getSourceAsString());
System.out.println("------华丽的分割线-----");
}
}
输出
{"name":"java"}
------华丽的分割线-----
// 关键字查询
@Test
public void keySelect() throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("course");
// 构建请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 关键字查询
sourceBuilder.query(QueryBuilders.termQuery("name","java"));
request.source(sourceBuilder);
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
// 查询结果
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
//输出每条结果信息
System.out.println(hit.getSourceAsString());
System.out.println("------华丽的分割线-----");
}
}
@Test
public void pageSelect() throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("course");
// 构建请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 查询
sourceBuilder.query(QueryBuilders.matchAllQuery());
// 当前页
sourceBuilder.from(1);
// 每页显示条
sourceBuilder.size(1);
request.source(sourceBuilder);
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
// 查询结果
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
//输出每条结果信息
System.out.println(hit.getSourceAsString());
System.out.println("------华丽的分割线-----");
}
}
输出
{"name":"python"}
------华丽的分割线-----
排序查询要以关键字keyword类型的字段进行排序
// 排序查询
@Test
public void sortSelect() throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("event");
// 构建请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 查询
sourceBuilder.query(QueryBuilders.matchAllQuery());
sourceBuilder.sort("address", SortOrder.DESC);
request.source(sourceBuilder);
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
// 查询结果
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
//输出每条结果信息
System.out.println(hit.getSourceAsString());
System.out.println("------华丽的分割线-----");
}
}
输出
{"name":"xuezai","address":"北爱尔兰","date":"2021-04-10 00:00:00","figure":"小识"}
------华丽的分割线-----
{"name":"haixiao","address":"东印度","date":"2021-04-10 00:00:00","figure":"小知"}
------华丽的分割线-----
// 过滤查询
@Test
public void filterSelect() throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("event");
// 构建请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 查询
sourceBuilder.query(QueryBuilders.matchAllQuery());
// 排除字段
String[] excludes = {};
// 包含字段
String[] includes = {"name", "address"};
sourceBuilder.fetchSource(includes, excludes);
request.source(sourceBuilder);
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
// 查询结果
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
//输出每条结果信息
System.out.println(hit.getSourceAsString());
System.out.println("------华丽的分割线-----");
}
}
输出
{"address":"东印度","name":"haixiao"}
------华丽的分割线-----
{"address":"北爱尔兰","name":"xuezai"}
------华丽的分割线-----
@Test
public void boolSelect() throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("event");
// 构建请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 布尔查询
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
/// 必须包含
boolQueryBuilder.must(QueryBuilders.matchQuery("name", "haixiao"));
// 一定不包含
boolQueryBuilder.mustNot(QueryBuilders.matchQuery("figure", "小识"));
// 可能包含
boolQueryBuilder.should(QueryBuilders.matchQuery("figure", "小识"));
// 查询
sourceBuilder.query(boolQueryBuilder);
request.source(sourceBuilder);
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
// 查询结果
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
//输出每条结果信息
System.out.println(hit.getSourceAsString());
System.out.println("------华丽的分割线-----");
}
}
输出
{"name":"haixiao","address":"东印度","date":"2021-04-10 00:00:00","figure":"小知"}
------华丽的分割线-----
@Test
public void rangeSelect() throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("event");
// 构建请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("date");
// 大于等于
rangeQuery.lte("2021-04-12 00:00:00");
// 小于等于
rangeQuery.lte("2021-04-13 00:00:00");
// 查询
sourceBuilder.query(rangeQuery);
request.source(sourceBuilder);
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
// 查询结果
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
//输出每条结果信息
System.out.println(hit.getSourceAsString());
System.out.println("------华丽的分割线-----");
}
}
输出
{"name":"haixiao","address":"东印度","date":"2021-04-10 00:00:00","figure":"小知"}
------华丽的分割线-----
{"name":"xuezai","address":"北爱尔兰","date":"2021-04-10 00:00:00","figure":"小识"}
------华丽的分割线-----
@Test
public void likeSelect() throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("event");
// 构建请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("figure", "小*");
// 查询
sourceBuilder.query(queryBuilder);
request.source(sourceBuilder);
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
// 查询结果
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
//输出每条结果信息
System.out.println(hit.getSourceAsString());
System.out.println("------华丽的分割线-----");
}
}
输出
{"name":"haixiao","address":"东印度","date":"2021-04-10 00:00:00","figure":"小知"}
------华丽的分割线-----
{"name":"xuezai","address":"北爱尔兰","date":"2021-04-10 00:00:00","figure":"小识"}
------华丽的分割线-----
@Test
public void hightLigntSelect() throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("event");
// 构建请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//高亮查询
TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("name","haixiao");
//设置查询方式
sourceBuilder.query(termsQueryBuilder);
//构建高亮字段
HighlightBuilder highlightBuilder = new HighlightBuilder();
//设置标签前缀
highlightBuilder.preTags("<font color='red'>");
//设置标签后缀
highlightBuilder.postTags("</font>");
//设置高亮字段
highlightBuilder.field("name");
//设置高亮构建对象
sourceBuilder.highlighter(highlightBuilder);
request.source(sourceBuilder);
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
// 查询结果
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
//输出每条结果信息
System.out.println(hit.getSourceAsString());
//打印高亮结果
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
System.out.println(highlightFields);
System.out.println("------华丽的分割线-----");
}
}
输出
{"name":"haixiao","address":"东印度","date":"2021-04-10 00:00:00","figure":"小知"}
{name=[name], fragments[[<font color='red'>haixiao</font>]]}
------华丽的分割线-----