Spring Boot 整合 Elasticsearch 7

Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene 基础之上。Elasticsearch 也是使用 Java 编写的,它的目的是使全文检索变得简单,通过隐藏 Lucene 的复杂性,取而代之的是提供一套简单一致的 RESTful API。

使用 ElasticSearch 需要添加 Maven 依赖:

<!-- elasticsearch -->
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.15.0</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-client</artifactId>
    <version>7.15.0</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.15.0</version>
</dependency>

在 JavaConfig 中注册 bean 即集成成功:

@Bean(name = "restHighLevelClient")
public RestHighLevelClient restHighLevelClient() {
    // 多个服务地址传递多个HttpHost即可
    RestClientBuilder builder = RestClient.builder(new HttpHost("127.0.0.1", 9200, "http"));
    return new RestHighLevelClient(builder);
}

1. 文档的增删改查

操作 ES 只需要注入 RestHighLevelClient 就可以了:

@Autowired
private RestHighLevelClient restHighLevelClient;

创建:

// 1.创建请求参数
IndexRequest request = new IndexRequest("cn_order_info");
// 设置分片路由(这里用uid进行分片)
request.routing("100001");
// id传orderId
request.id("2000000020");

// 设置数据文档
Map<String, Object> data = new HashMap<>(16);
data.put("order_id", 2000000020L);
data.put("product_name", "MySQL核心技术");
data.put("uid", "100001");
data.put("status", 1);
data.put("is_deleted", 0);
String nowString = DateTime.now().toString("yyyy-MM-dd HH:mm:ss");
data.put("create_time", nowString);
data.put("modify_time", nowString);
request.source(data);

// 2.创建
IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
// 如果已创建返回RestStatus.OK
Assert.assertEquals(RestStatus.CREATED, response.status());

删除:

// 1.创建请求参数, id传orderId
DeleteRequest request = new DeleteRequest("cn_order_info", "2000000020");
// 设置分片路由(这里用uid进行分片)
request.routing("100001");

// 2.删除
DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
Assert.assertEquals(RestStatus.OK, response.status());

修改:

// 1.创建请求参数, id传orderId
UpdateRequest request = new UpdateRequest("cn_order_info", "2000000020");
// 设置分片路由(这里用uid进行分片)
request.routing("100001");

// 设置数据
Map<String, Object> data = new HashMap<>(16);
data.put("status", 2);
String nowString = DateTime.now().toString("yyyy-MM-dd HH:mm:ss");
data.put("modify_time", nowString);
request.doc(data);
request.docAsUpsert(true);

// 2.更新
UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
Assert.assertEquals(RestStatus.OK, response.status());

查询:

// 1.创建请求参数, id传orderId
GetRequest request = new GetRequest("cn_order_info", "2000000020");
// 设置分片路由(这里用uid进行分片)
request.routing("100001");

// 2.查询
GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
log.info("查询结果: " + JSON.toJSONString(response.getSource()));

分页查询:

// 1.创建SearchSourceBuilder对象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 偏移量
searchSourceBuilder.from(0);
// 每页的数量
searchSourceBuilder.size(10);
// 设置排序规则
searchSourceBuilder.sort("create_time", SortOrder.DESC);
// 查询条件, 生成DSL查询语句
BoolQueryBuilder queryBuilder = new BoolQueryBuilder();
queryBuilder.must(QueryBuilders.termQuery("status", 1));
// 设置超时时间, 单位毫秒
searchSourceBuilder.timeout(new TimeValue(5000));

// 2.创建请求参数
SearchRequest searchRequest = new SearchRequest("cn_order_info");
// 按uid路由分片
searchRequest.routing("100001");
// 一个index要求只能有一个type, 所以type参数不设置
//searchRequest.types(tableName);
// 设置SearchSourceBuilder查询属性
searchRequest.source(searchSourceBuilder);

// 3.查询
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
if (response.getHits() == null || response.getHits().getHits() == null
        || response.getHits().getHits().length == 0) {
    log.info("分页查询结果为空");
    return;
}
List<JSONObject> resultList = new ArrayList<>();
for (SearchHit hit : response.getHits().getHits()) {

    resultList.add(JSON.parseObject(hit.getSourceAsString()));
}
log.info("分页查询结果: " + JSON.toJSONString(resultList));
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值