Elasticsearch 软件是由 Java 语言开发的,所以也可以通过 Java API 的方式对 Elasticsearch服务进行访问
创建maven项目,导入以下依赖
客户端对象org.elasticsearch elasticsearch 7.8.0 org.elasticsearch.client elasticsearch-rest-high-level-client 7.8.0 org.apache.logging.log4j log4j-api 2.8.2 org.apache.logging.log4j log4j-core 2.8.2 com.fasterxml.jackson.core jackson-databind 2.9.9 junit junit 4.12
创建 com.atguigu.es.test.Elasticsearch01_Client 类,代码中创建 Elasticsearch 客户端对象因为早期版本的客户端对象已经不再推荐使用,且在未来版本中会被删除,所以这里我们采用高级 REST 客户端对象
// 创建客户端对象
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
...
// 关闭客户端连接
client.close();
注意:9200 端口为 Elasticsearch 的 Web 通信端口,10.10.10.113 为启动 ES 服务的主机名
索引操作 创建索引使用上面的客户端对象
// 创建索引
CreateIndexRequest createIndexRequest = new CreateIndexRequest("user");
CreateIndexResponse createIndexResponse = esClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
// 响应状态
boolean createIndexResponseAcknowledged = createIndexResponse.isAcknowledged();
System.out.println("索引创建操作:" + createIndexResponseAcknowledged);
// 索引创建操作:true
查询索引
// 查询索引
GetIndexRequest request = new GetIndexRequest("user");
GetIndexResponse response = esClient.indices().get(request, RequestOptions.DEFAULT);
// 响应
System.out.println(response.getAliases());
System.out.println(response.getMappings());
System.out.println(response.getSettings());
// {user=[]}
// {user=org.elasticsearch.cluster.metadata.Mappingmetadata@8cb3deb3}
// {user={"index.creation_date":"1638348829779","index.number_of_replicas":"1","index.number_of_shards":"1","index.provided_name":"user","index.uuid":"VrJIUa6OSGS1-pNQElAVSQ","index.version.created":"7080099"}}
删除索引
// 删除索引
DeleteIndexRequest request = new DeleteIndexRequest("user");
AcknowledgedResponse response = esClient.indices().delete(request, RequestOptions.DEFAULT);
// 响应状态
System.out.println(response.isAcknowledged());
文档操作
创建文档&全量更新文档
// 插入数据
User user = new User();
user.setName("张三");
user.setAge(40);
user.setSex("男");
// 向ES中插入数据,必须将数据转成JSON
ObjectMapper mapper = new ObjectMapper();
String userJson = mapper.writevalueAsString(user);
IndexRequest request = new IndexRequest();
request.index("user")
.id("1001")
.source(userJson, XContentType.JSON);
IndexResponse response = esClient.index(request, RequestOptions.DEFAULT);
System.out.println(response.getResult()); // CREATED, 更新时为UPDATED
修改文档
// 修改数据
UpdateRequest request = new UpdateRequest();
request.index("user")
.id("1001")
.doc(XContentType.JSON, "sex", "女");
UpdateResponse response = esClient.update(request, RequestOptions.DEFAULT);
System.out.println(response.getResult()); // UPDATED
esClient.close();
查询文档
// 查询数据
GetRequest request = new GetRequest();
request.index("user")
.id("1001");
GetResponse response = esClient.get(request, RequestOptions.DEFAULT);
System.out.println(response.getSourceAsString());
// {"name":"张三","sex":"女","age":40}
删除文档
// 删除数据
DeleteRequest request = new DeleteRequest();
request.index("user")
.id("1001");
DeleteResponse response = esClient.delete(request, RequestOptions.DEFAULT);
System.out.println(response.getResult()); // DELETED
批量新增
// 批量增加数据
BulkRequest request = new BulkRequest();
request.add(new IndexRequest().index("user").id("10001").source(XContentType.JSON, "name", "张三"));
request.add(new IndexRequest().index("user").id("10002").source(XContentType.JSON, "name", "李四"));
request.add(new IndexRequest().index("user").id("10003").source(XContentType.JSON, "name", "王五"));
request.add(new IndexRequest().index("user").id("10004").source(XContentType.JSON, "name", "赵柳"));
BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);
System.out.println(response.getTook());
System.out.println(response.getItems());
批量删除
// 批量删除数据
BulkRequest request = new BulkRequest();
request.add(new DeleteRequest().index("user").id("10001"));
request.add(new DeleteRequest().index("user").id("10002"));
request.add(new DeleteRequest().index("user").id("10003"));
request.add(new DeleteRequest().index("user").id("10004"));
BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);
System.out.println(response.getTook());
System.out.println(response.getItems());
查询操作
// 全量查询:matchAllQuery
SearchRequest request = new SearchRequest();
request.indices("user");
request.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits());
System.out.println(response.getTook());
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
// 6 hits
// 39ms
// {"name":"张三","sex":"男","age":30}
// {"name":"李四","sex":"男","age":40}
// {"name":"王五","sex":"女","age":50}
// {"name":"赵柳","sex":"女","age":60}
// {"name":"张三1","sex":"男","age":30}
// {"name":"张1三","sex":"男","age":30}
//
// 条件查询:termQuery
SearchRequest request = new SearchRequest();
request.indices("user")
.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("age", 30)));
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
//
// 分页查询
SearchRequest request = new SearchRequest();
SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
// from = (pageNumber - 1) * size
builder.from(0).size(2);
request.indices("user")
.source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
//
// 查询排序
SearchRequest request = new SearchRequest();
SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
builder.sort("age", SortOrder.DESC);
request.indices("user")
.source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
//
// 过滤字段
SearchRequest request = new SearchRequest();
SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
String[] excludes = {}; // 不要的
String[] includes = {"name"}; // 要的
builder.fetchSource(includes, excludes);
request.indices("user")
.source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
//
// 组合查询
SearchRequest request = new SearchRequest();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// boolQueryBuilder.must(QueryBuilders.matchQuery("age", 30));
// boolQueryBuilder.must(QueryBuilders.matchQuery("sex", "男"));
// boolQueryBuilder.mustNot(QueryBuilders.matchQuery("sex", "男"));
boolQueryBuilder.should(QueryBuilders.matchQuery("sex", "男"));
boolQueryBuilder.should(QueryBuilders.matchQuery("sex", "女"));
SearchSourceBuilder builder = new SearchSourceBuilder().query(boolQueryBuilder);
request.indices("user")
.source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
//
// 范围查询
SearchRequest request = new SearchRequest();
RangeQueryBuilder queryBuilder = QueryBuilders.rangeQuery("age");
queryBuilder.gte(30).lte(40);
SearchSourceBuilder builder = new SearchSourceBuilder().query(queryBuilder);
request.indices("user").source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
//
// 模糊查询
SearchRequest request = new SearchRequest();
// fuzziness(偏差的距离)
FuzzyQueryBuilder fuzziness = QueryBuilders.fuzzyQuery("name", "张三").fuzziness(Fuzziness.ONE);
SearchSourceBuilder builder = new SearchSourceBuilder().query(fuzziness);
request.indices("user").source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
// {"name":"张三","sex":"男","age":30}
// {"name":"张三1","sex":"男","age":30}
// {"name":"张1三","sex":"男","age":30}
//
// 高亮查询
SearchRequest request = new SearchRequest();
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "张三");
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("");
highlightBuilder.postTags("");
highlightBuilder.field("name");
SearchSourceBuilder builder = new SearchSourceBuilder().query(termQueryBuilder).highlighter(highlightBuilder);
request.indices("user").source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
//
// 聚合查询
SearchRequest request = new SearchRequest();
AggregationBuilder aggregationBuilder = AggregationBuilders.max("maxAge").field("age");
SearchSourceBuilder builder = new SearchSourceBuilder().aggregation(aggregationBuilder);
request.indices("user").source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
//
// 分组查询
SearchRequest request = new SearchRequest();
AggregationBuilder aggregationBuilder = AggregationBuilders.terms("ageGroup").field("age");
SearchSourceBuilder builder = new SearchSourceBuilder().aggregation(aggregationBuilder).size(0);
request.indices("user").source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);



