本文只涉及一些基本操作!
引入依赖
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.8.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.8.0</version>
</dependency>
创建客户端:
前提是先在本地运行好 es
public static void main(String[] args) throws Exception {
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9201,"http"))
);
// 关闭 ES 客户端
esClient.close();
}
索引操作
新增索引
// 创建索引
CreateIndexRequest request = new CreateIndexRequest("user");
CreateIndexResponse response = esClient.indices().create(request, RequestOptions.DEFAULT);
//查看响应状态
boolean acknowledged = response.isAcknowledged();
System.out.println("操作索引:"+acknowledged);
删除索引
// 删除索引
DeleteIndexRequest request = new DeleteIndexRequest("user");
AcknowledgedResponse response = esClient.indices().delete(request, RequestOptions.DEFAULT);
//查看响应状态
boolean acknowledged = response.isAcknowledged();
System.out.println("操作索引:"+acknowledged);
查询索引
// 查询索引
GetIndexRequest request = new GetIndexRequest("user");
GetIndexResponse response = esClient.indices().get(request, RequestOptions.DEFAULT);
// 获取别名
System.out.println(response.getAliases());
文档操作
基本操作
新增
注意:向 ES 中插入数据前要先把对象转为 JSON
//向哪个索引插入?主键ID是啥?
request.index("user").id("1");
User user=new User();
user.setName("shone");
user.setAge(20);
user.setSex("男");
//向 ES 插入数据必须转化为 JSON!
ObjectMapper objectMapper = new ObjectMapper();
String userJson = objectMapper.writeValueAsString(user);
// 放入请求中
request.source(userJson, XContentType.JSON);
IndexResponse response = esClient.index(request, RequestOptions.DEFAULT);
// 查看是否插入成功
System.out.println(response.getResult());
更新
UpdateRequest request = new UpdateRequest();
// 指定索引和 ID
request.index("user").id("1");
//修改文档
request.doc(XContentType.JSON,"age","21");
UpdateResponse response = esClient.update(request, RequestOptions.DEFAULT);
查询
GetRequest request = new GetRequest();
//指定索引和 ID
request.index("user").id("1");
GetResponse response = esClient.get(request, RequestOptions.DEFAULT);
// 获取文档内容(以字符串形式返回)
System.out.println(response.getSourceAsString());
删除
DeleteRequest request = new DeleteRequest();
request.index("user").id("1");
DeleteResponse response = esClient.delete(request, RequestOptions.DEFAULT);
System.out.println(response.toString());
批量操作
本质上是把多个请求进行打包处理
批量新增
// 批量新增数据
BulkRequest bulkRequest = new BulkRequest();
IndexRequest request1 = new CreateIndexRequest().index("user").id("2").source(XContentType.JSON, "name", "shone2","age","18","sex","男");
IndexRequest request2 = new IndexRequest().index("user").id("3").source(XContentType.JSON, "age", "22");
IndexRequest request3 = new IndexRequest().index("user").id("4").source(XContentType.JSON, "sex", "女");
bulkRequest.add(request1);
bulkRequest.add(request2);
bulkRequest.add(request3);
//批量处理
BulkResponse response = esClient.bulk(bulkRequest, RequestOptions.DEFAULT);
// 批量处理的花费时间
System.out.println(response.getTook());
批量删除
//批量删除
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.add(new DeleteRequest().index("user").id("2"));
bulkRequest.add(new DeleteRequest().index("user").id("3"));
bulkRequest.add(new DeleteRequest().index("user").id("4"));
esClient.bulk(bulkRequest, RequestOptions.DEFAULT);
高级查询操作
全量查询( matchAllQuery )
// 查询索引中全部的数据
SearchRequest request = new SearchRequest();
request.indices("user");
//构造查询条件(全量查询)
SearchSourceBuilder query = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
request.source(query);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
// 获取匹配到的数据
SearchHits hits = response.getHits();
// 总条数
System.out.println(hits.getTotalHits());
// 分别打印每条数据
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
条件查询( termQuery )
// 2. 条件查询 : termQuery
SearchRequest request = new SearchRequest();
request.indices("user");
//构造查询条件
SearchSourceBuilder query = new SearchSourceBuilder().query(QueryBuilders.termQuery("age",20));
request.source(query);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
分页查询(SearchSourceBuilder.from 和 SearchSourceBuilder.to )
SearchRequest request = new SearchRequest();
request.indices("user");
// 全量查询
SearchSourceBuilder query = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
// 构造分页条件
query.from(0);
query.size(2);
request.source(query);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
排序查询( SearchSourceBuilder.sort )
SearchRequest request = new SearchRequest();
request.indices("user");
//构造查询条件
SearchSourceBuilder query = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
query.sort("age",SortOrder.DESC);
request.source(query);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
过滤字段查询( SearchSourceBuilder.fetchSource)
SearchRequest request = new SearchRequest();
request.indices("user");
SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
// 选择包含/不包含某个字段
String[] include=new String[]{"name"};
String[] exclude=new String[]{};
builder.fetchSource(include,exclude);
request.source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
多条件查询
使用:QueryBuilders.boolQuery()
通过:
boolQueryBuilder.must()
boolQueryBuilder.mustNot()
boolQueryBuilder.should( ) 等来指定条件
SearchRequest request = new SearchRequest();
request.indices("user");
SearchSourceBuilder builder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.matchQuery("age","20"));
boolQueryBuilder.must(QueryBuilders.matchQuery("sex","女"));
builder.query(boolQueryBuilder);
request.source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
范围查询
使用:
QueryBuilders.rangeQuery(”需要范围查询的字段“)
通过:
rangeQueryBuilder.gt();
rangeQueryBuilder.gte();
rangeQueryBuilder.lt();
rangeQueryBuilder.lte();
rangeQueryBuilder.from(起始位置(闭区间));
rangeQueryBuilder.to(末位置(闭区间)); 等来指定条件
SearchRequest request = new SearchRequest();
request.indices("user");
SearchSourceBuilder builder = new SearchSourceBuilder();
// 指定对 age 进行范围查询
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age");
rangeQueryBuilder.gt(18);
rangeQueryBuilder.lte(20);
builder.query(rangeQueryBuilder);
request.source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
模糊查询
使用:
QueryBuilders.fuzzyQuery("name", "shone").fuzziness(Fuzziness.ONE);
指定需要模糊查询的名称和模糊查询的容忍度。
SearchRequest request = new SearchRequest();
request.indices("user");
SearchSourceBuilder builder = new SearchSourceBuilder();
// 要对哪个字段进行模糊查询,以及模糊查询的容忍度
FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("name", "shone").fuzziness(Fuzziness.ONE);
builder.query(fuzzyQueryBuilder);
request.source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
高亮查询
使用:
HighlightBuilder()
通过:
HighlightBuilder.field("字段名称") 来指定要高亮的部分
SearchRequest request = new SearchRequest();
request.indices("user");
SearchSourceBuilder builder = new SearchSourceBuilder();
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "shone");
//高亮
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<span style=\"background-color: yellow;\">");
highlightBuilder.postTags("</span>");
highlightBuilder.field("name");
// 分别添加 查询 builder 和 高亮 builder
builder.query(termQueryBuilder);
builder.highlighter(highlightBuilder);
request.source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
聚合查询
通过
AggregationBuilders.max(”自定义聚合参数名称“," 需要聚合的字段 ")
AggregationBuilders.min()
AggregationBuilders.sum() 等来进行聚合
SearchRequest request = new SearchRequest();
request.indices("user");
SearchSourceBuilder builder = new SearchSourceBuilder();
// 使用聚合查询(自定义名称并且指明字段)
AggregationBuilder aggregationBuilder = AggregationBuilders.max("maxAge").field("age");
builder.aggregation(aggregationBuilder);
request.source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
分组查询
通过
AggregationBuilders.terms("自定义分组名称").field("需要分组的字段")
SearchRequest request = new SearchRequest();
request.indices("user");
SearchSourceBuilder builder = new SearchSourceBuilder();
AggregationBuilder aggregationBuilder = AggregationBuilders.terms("ageGroup").field("age");
builder.aggregation(aggregationBuilder);
request.source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);