三、JAVA API示例(7.8.0)
3.1 环境搭建
3.1.1 引入Maven依赖
<dependencies>
<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>
<!-- elasticsearch 依赖 2.x 的 log4j -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
</dependency>
<!-- junit 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
3.1.2 创建ES客户端对象
import org.elasticsearch.client.RestHighLevelClient;
// 创建客户端对象
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
// xxxx
// 关闭客户端对象
client.close();
这里使用的是高级 REST 客户端对象
3.1.3 学习注意
在学习Java API时,一定不能死记硬背,需要结合前面学习的http指令来学习。ElasticSearch的客户端Java API主要是用于帮助用户通过Java代码构建http请求指令,因此学会前面的http指令才是最为重要的。
对于Java API的使用,各位同学在使用之前,最好先写出需要构建的http指令,然后再尝试通过API去构建自己的指令。
3.2 索引
3.2.1 创建索引
/**
* 创建索引
*
* @param client ES客户端对象
*/
private static void createIndex(RestHighLevelClient client) throws IOException {
// 创建索引 - 请求对象
CreateIndexRequest request = new CreateIndexRequest(INDEX_NAME);
// 发送请求,获取响应
CreateIndexResponse response = client.indices().create(request,
RequestOptions.DEFAULT);
// 响应状态
boolean acknowledged = response.isAcknowledged();
}
3.2.2 查看索引
/**
* 查询索引
*
* @param client ES客户端对象
*/
private static void searchIndex(RestHighLevelClient client) throws IOException {
// 查询索引 - 请求对象
GetIndexRequest request = new GetIndexRequest(INDEX_NAME);
// 发送请求,获取响应
GetIndexResponse response = client.indices().get(request,
RequestOptions.DEFAULT);
System.out.println("aliases:" + response.getAliases());
System.out.println("mappings:" + response.getMappings());
System.out.println("settings:" + response.getSettings());
}
结果如下图:
3.2.3 删除索引
/**
* 删除索引
*
* @param client ES客户端对象
*/
private static void deleteIndex(RestHighLevelClient client) throws IOException {
// 创建索引 - 请求对象
DeleteIndexRequest request = new DeleteIndexRequest(INDEX_NAME);
// 发送请求,获取响应
AcknowledgedResponse response = client.indices().delete(request,
RequestOptions.DEFAULT);
// 响应状态
boolean acknowledged = response.isAcknowledged();
}
3.3 文档
创建一个User数据结构,结构如下
public class User {
private String name;
private String sex;
private Integer age;
private String tel;
// 省略getter/setter
}
3.3.1 创建文档
/**
* 添加文档
*
* @param client ES客户端对象
*/
private static void addDocument(RestHighLevelClient client) throws IOException {
User user = new User();
user.setName("张三");
user.setAge(22);
user.setSex("男");
user.setTel("13111111111");
// 新增文档 - 请求对象
IndexRequest request = new IndexRequest();
request.index(INDEX_NAME).id("1");
// 将对象转换为json字符串
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(user);
// 添加文档数据,数据格式为 JSON 格式
request.source(json, XContentType.JSON);
// 客户端发送请求,获取响应对象
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
// 打印结果信息
System.out.println("_index:" + response.getIndex());
System.out.println("_id:" + response.getId());
System.out.println("_result:" + response.getResult());
}
结果如下图:
3.3.2 查看文档
/**
* 查询文档
*
* @param client ES客户端对象
*/
private static void searchDocument(RestHighLevelClient client) throws IOException {
// 创建请求对象
GetRequest request = new GetRequest().index(INDEX_NAME).id("1");
// 客户端发送请求,获取响应对象
GetResponse response = client.get(request, RequestOptions.DEFAULT);
// 打印结果信息
System.out.println("_index:" + response.getIndex());
System.out.println("_type:" + response.getType());
System.out.println("_id:" + response.getId());
System.out.println("source:" + response.getSourceAsString());
}
结果如下图:
3.3.3 修改文档
全量修改
/**
* 修改文档-全量
*
* @param client ES客户端对象
*/
private static void updateDocument(RestHighLevelClient client) throws IOException {
User user = new User();
user.setName("李四");
user.setAge(30);
user.setSex("女");
user.setTel("13111111113");
// 将对象转换为Map
Map<String, Object> map = JSON.parseObject(JSON.toJSONString(user), new TypeReference<Map<String, Object>>() {
});
// 修改文档 - 请求对象
UpdateRequest request = new UpdateRequest();
// 配置修改参数
request.index(INDEX_NAME).id("1");
// 设置请求体,对数据进行修改
request.doc(map, XContentType.JSON);
// 客户端发送请求,获取响应对象
UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
System.out.println("_index:" + response.getIndex());
System.out.println("_id:" + response.getId());
System.out.println("_result:" + response.getResult());
System.out.println("-----查询------");
// 查询
searchDocument(client);
}
结果如下图:
局部修改
/**
* 修改文档-局部
*
* @param client ES客户端对象
*/
private static void updateDocument2(RestHighLevelClient client) throws IOException {
// 修改文档 - 请求对象
UpdateRequest request = new UpdateRequest();
// 配置修改参数
request.index(INDEX_NAME).id("1");
// 设置请求体,对数据进行修改
request.doc(XContentType.JSON, "sex", "男");
// 客户端发送请求,获取响应对象
UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
System.out.println("_index:" + response.getIndex());
System.out.println("_id:" + response.getId());
System.out.println("_result:" + response.getResult());
System.out.println("-----查询------");
// 查询
searchDocument(client);
}
结果如下图:
3.3.4 删除文档
/**
* 删除文档
*
* @param client ES客户端对象
*/
private static void deleteDocument(RestHighLevelClient client) throws IOException {
// 创建请求对象
DeleteRequest request = new DeleteRequest().index(INDEX_NAME).id("1");
// 客户端发送请求,获取响应对象
DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
// 打印结果信息
System.out.println("_index:" + response.getIndex());
System.out.println("_id:" + response.getId());
System.out.println("_result:" + response.getResult());
System.out.println("-----查询------");
// 查询
searchDocument(client);
}
结果如下图:
3.3.5 批量新增文档
/**
* 添加文档-批量
*
* @param client ES客户端对象
*/
private static void addDocumentBatch(RestHighLevelClient client) throws IOException {
//创建批量新增请求对象
BulkRequest request = new BulkRequest();
for (int i = 1; i < 11; i++) {
User user = new User();
user.setName("用户" + i);
user.setAge(20 + i);
user.setTel("13111111111");
user.setSex(i % 2 == 0 ? "男" : "女");
IndexRequest indexRequest = new IndexRequest();
indexRequest.index(INDEX_NAME).id(i + "");
// 将对象转换为json字符串
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(user);
indexRequest.source(json, XContentType.JSON);
request.add(indexRequest);
}
// 批量新增
BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT);
}
3.3.6 批量删除文档
/**
* 删除文档-批量
*
* @param client ES客户端对象
*/
private static void deleteDocumentBatch(RestHighLevelClient client) throws IOException {
// 创建批量删除请求对象
BulkRequest request = new BulkRequest();
request.add(new DeleteRequest().index(INDEX_NAME).id("1"));
request.add(new DeleteRequest().index(INDEX_NAME).id("2"));
request.add(new DeleteRequest().index(INDEX_NAME).id("3"));
// 客户端发送请求,获取响应对象
BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT);
}
3.4 高级查询
查询结果打印
/**
* 查询结果打印
*
* @param response 查询结果
* @param title 操作标题
*/
private static void printResultForSearchHighLevel(SearchResponse response, String title) {
// 获取响应体中的hits字段的值(匹配的结果)
SearchHits hits = response.getHits();
System.out.println(title);
// 总耗时(ms)
System.out.println("took:" + response.getTook());
// 是否超时
System.out.println("timeout:" + response.isTimedOut());
// 结果总数
System.out.println("total:" + hits.getTotalHits());
// 最大得分
System.out.println("MaxScore:" + hits.getMaxScore());
System.out.println("hits:【");
for (SearchHit hit : hits) {
// 输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
if (!hit.getHighlightFields().isEmpty()) {
System.out.println(hit.getHighlightFields());
}
}
System.out.println("】");
}
3.4.1 查询所有文档
/**
* 高级查询-查询所有文档
*
* @param client ES客户端对象
*/
private static void matchAll(RestHighLevelClient client) throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest().indices(INDEX_NAME);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 查询所有数据
sourceBuilder.query(QueryBuilders.matchAllQuery());
request.source(sourceBuilder);
// 响应信息
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 输出结果
printResultForSearchHighLevel(response, "全量查询结果如下:");
}
结果如下
3.4.2 匹配查询
/**
* 高级查询-匹配查询
*
* @param client ES客户端对象
*/
private static void match(RestHighLevelClient client) throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest().indices(INDEX_NAME);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 构造查询条件
sourceBuilder.query(QueryBuilders.matchQuery("name", "用户"));
request.source(sourceBuilder);
// 响应信息
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 输出结果
printResultForSearchHighLevel(response, "匹配查询结果如下:");
}
查询name字段包含“用户”的数据
结果如下
3.4.3 多字段匹配查询
/**
* 高级查询-多字段匹配查询
*
* @param client ES客户端对象
*/
private static void multiMatch(RestHighLevelClient client) throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest().indices(INDEX_NAME);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 构造查询条件
sourceBuilder.query(QueryBuilders.multiMatchQuery("女", "name","sex"));
request.source(sourceBuilder);
// 响应信息
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 输出结果
printResultForSearchHighLevel(response, "多字段匹配查询结果如下:");
}
查询字段name或sex中包含“女”的数据
结果如下
3.4.4 关键字精确查询
/**
* 高级查询-精确匹配查询
*
* @param client ES客户端对象
*/
private static void term(RestHighLevelClient client) throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest().indices(INDEX_NAME);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 构造查询条件
sourceBuilder.query(QueryBuilders.termQuery("age",23));
request.source(sourceBuilder);
// 响应信息
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 输出结果
printResultForSearchHighLevel(response, "精确匹配查询结果如下:");
}
查询age字段为23的数据
结果如下图所示
3.4.5 多关键字精确匹配
/**
* 高级查询-多关键字精确匹配查询
*
* @param client ES客户端对象
*/
private static void terms(RestHighLevelClient client) throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest().indices(INDEX_NAME);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 构造查询条件
List<Integer> ages = new ArrayList<>();
ages.add(22);
ages.add(23);
sourceBuilder.query(QueryBuilders.termsQuery("age",ages));
request.source(sourceBuilder);
// 响应信息
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 输出结果
printResultForSearchHighLevel(response, "多关键字精确匹配查询结果如下:");
}
查询age为22或者23的数据
结果如下
3.4.6 组合查询
-
must示例
/** * 高级查询-组合查询-must * * @param client ES客户端对象 */ private static void mustQuery(RestHighLevelClient client) throws IOException { // 创建搜索请求对象 SearchRequest request = new SearchRequest().indices(INDEX_NAME); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // 构造查询条件 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); boolQueryBuilder.must(QueryBuilders.matchQuery("name","用户")); boolQueryBuilder.must(QueryBuilders.termQuery("age",23)); sourceBuilder.query(boolQueryBuilder); request.source(sourceBuilder); // 响应信息 SearchResponse response = client.search(request, RequestOptions.DEFAULT); // 输出结果 printResultForSearchHighLevel(response, "组合查询-must查询结果如下:"); }
查询name字段包含“用户”且age字段值为23的数据
结果如下
-
must_not示例
/** * 高级查询-组合查询-must_not * * @param client ES客户端对象 */ private static void mustNotQuery(RestHighLevelClient client) throws IOException { // 创建搜索请求对象 SearchRequest request = new SearchRequest().indices(INDEX_NAME); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // 构造查询条件 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); boolQueryBuilder.mustNot(QueryBuilders.matchQuery("sex","男")); boolQueryBuilder.mustNot(QueryBuilders.termQuery("age",21)); sourceBuilder.query(boolQueryBuilder); request.source(sourceBuilder); // 响应信息 SearchResponse response = client.search(request, RequestOptions.DEFAULT); // 输出结果 printResultForSearchHighLevel(response, "组合查询-must_not查询结果如下:"); }
排除sex字段包含“男”以及age字段为21的数据
结果如下
-
should示例
/** * 高级查询-组合查询-should * * @param client ES客户端对象 */ private static void shouldQuery(RestHighLevelClient client) throws IOException { // 创建搜索请求对象 SearchRequest request = new SearchRequest().indices(INDEX_NAME); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // 构造查询条件 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); boolQueryBuilder.should(QueryBuilders.matchQuery("sex","男")); boolQueryBuilder.should(QueryBuilders.termQuery("age",23)); sourceBuilder.query(boolQueryBuilder); request.source(sourceBuilder); // 响应信息 SearchResponse response = client.search(request, RequestOptions.DEFAULT); // 输出结果 printResultForSearchHighLevel(response, "组合查询-should查询结果如下:"); }
查询age字段是23或者sex字段包含“男”的数据
结果如下
3.4.7 范围查询
/**
* 高级查询-范围查询
*
* @param client ES客户端对象
*/
private static void rangeQuery(RestHighLevelClient client) throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest().indices(INDEX_NAME);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age");
rangeQueryBuilder.gte(23);
rangeQueryBuilder.lte(28);
sourceBuilder.query(rangeQueryBuilder);
request.source(sourceBuilder);
// 响应信息
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 输出结果
printResultForSearchHighLevel(response, "范围查询结果如下:");
}
查询age字段的值在[23,28]范围内的数据
结果如下
3.4.8 查询指定字段
/**
* 高级查询-查询指定字段
*
* @param client ES客户端对象
*/
private static void fetchSourceQuery(RestHighLevelClient client) throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest().indices(INDEX_NAME);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 指定查询的字段
String[] excludes = {};
String[] includes = {"name", "age"};
sourceBuilder.fetchSource(includes, excludes);
// 查询所有数据
sourceBuilder.query(QueryBuilders.matchAllQuery());
request.source(sourceBuilder);
// 响应信息
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 输出结果
printResultForSearchHighLevel(response, "查询指定字段结果如下:");
}
结果如下
3.4.9 排序查询
/**
* 高级查询-排序查询
*
* @param client ES客户端对象
*/
private static void sortQuery(RestHighLevelClient client) throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest().indices(INDEX_NAME);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 查询所有数据
sourceBuilder.query(QueryBuilders.matchAllQuery());
// 根据age字段排序,倒序
sourceBuilder.sort("age",SortOrder.DESC);
request.source(sourceBuilder);
// 响应信息
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 输出结果
printResultForSearchHighLevel(response, "排序查询结果如下:");
}
结果如下
3.4.10 分页查询
/**
* 高级查询-分页查询
*
* @param client ES客户端对象
*/
private static void pageQuery(RestHighLevelClient client) throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest().indices(INDEX_NAME);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 查询所有数据
sourceBuilder.query(QueryBuilders.matchAllQuery());
// 分页查询
// 开始位置 = (页码 - 1) * 页大小
sourceBuilder.from(0);
// 页大小
sourceBuilder.size(4);
request.source(sourceBuilder);
// 响应信息
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 输出结果
printResultForSearchHighLevel(response, "分页查询结果如下:");
}
结果如下
3.4.11 聚合查询
/**
* 高级查询-聚合查询
*
* @param client ES客户端对象
*/
private static void aggregationsQuery(RestHighLevelClient client) throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest().indices(INDEX_NAME);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 构建查询条件
sourceBuilder.aggregation(AggregationBuilders.max("age_max").field("age"));
sourceBuilder.aggregation(AggregationBuilders.min("age_min").field("age"));
sourceBuilder.aggregation(AggregationBuilders.avg("age_avg").field("age"));
sourceBuilder.aggregation(AggregationBuilders.sum("age_sum").field("age"));
sourceBuilder.aggregation(AggregationBuilders.stats("age_stats").field("age"));
sourceBuilder.aggregation(AggregationBuilders.cardinality("age_cardinality").field("age"));
sourceBuilder.aggregation(AggregationBuilders.terms("age_group").field("age"));
request.source(sourceBuilder);
// 响应信息
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 输出结果
ParsedMax ageMax = (ParsedMax) response.getAggregations().getAsMap().get("age_max");
ParsedMin ageMin = (ParsedMin) response.getAggregations().getAsMap().get("age_min");
ParsedAvg ageAvg = (ParsedAvg) response.getAggregations().getAsMap().get("age_avg");
ParsedSum ageSum = (ParsedSum) response.getAggregations().getAsMap().get("age_sum");
ParsedStats ageStats = (ParsedStats) response.getAggregations().getAsMap().get("age_stats");
ParsedCardinality ageCardinality = (ParsedCardinality) response.getAggregations().getAsMap().get("age_cardinality");
ParsedTerms ageGroup = (ParsedTerms) response.getAggregations().getAsMap().get("age_group");
System.out.println(ageMax.getName() + ":" + ageMax.getValue());
System.out.println(ageMin.getName() + ":" + ageMin.getValue());
System.out.println(ageAvg.getName() + ":" + ageAvg.getValue());
System.out.println(ageSum.getName() + ":" + ageSum.getValue());
System.out.println(ageStats.getName() + ":{" + "max:" + ageStats.getMax()
+ "," + "min:" + ageStats.getMin()
+ "," + "avg:" + ageStats.getAvg()
+ "," + "sum:" + ageStats.getSum()
+ "," + "count:" + ageStats.getCount() + "}");
System.out.println(ageCardinality.getName() + ":" + ageCardinality.getValue());
System.out.println(ageGroup.getName() + ":" + ageGroup.getBuckets().size());
}
结果如下
3.4.12 高亮查询
/**
* 高级查询-高亮查询
*
* @param client ES客户端对象
*/
private static void highlightQuery(RestHighLevelClient client) throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest().indices(INDEX_NAME);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 查询所有数据
sourceBuilder.query(QueryBuilders.matchQuery("sex","男"));
// 高亮查询
HighlightBuilder highlightBuilder = new HighlightBuilder();
// 设置标签前缀
highlightBuilder.preTags("<font color='red'>");
// 设置标签后缀
highlightBuilder.postTags("</font>");
// 设置高亮字段
highlightBuilder.field("sex");
sourceBuilder.highlighter(highlightBuilder);
request.source(sourceBuilder);
// 响应信息
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 输出结果
printResultForSearchHighLevel(response, "高亮查询结果如下:");
}
结果如下
参考