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));