1、创建maven项目
通过IDEA开发工具创建一个maven项目
修改pom
文件,添加如下依赖
<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>
<!-- junit 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
</dependencies>
2、客户端对象
创建一个创建ES客户端的工具类
public class EsClientUtil {
public static RestHighLevelClient getClient() {
return new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
}
public static RestHighLevelClient getClientByAuth() {
String hostname = "localhost";
int port = 9200;
String scheme = "http";
String username = "***";
String password = "***";
//创建凭证
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(hostname, port, scheme))
.setHttpClientConfigCallback(httpAsyncClientBuilder -> httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
return new RestHighLevelClient(restClientBuilder);
}
}
再添加一个模型类
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
private String name;
private Integer age;
private String sex;
}
3、索引操作
1)创建索引
@Test
public void insertIndex() throws Exception {
RestHighLevelClient client = EsClientUtil.getClient();
// 创建索引请求 对象
CreateIndexRequest createIndexRequest = new CreateIndexRequest("user");
// 发送请求,获取响应
CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
boolean acknowledged = createIndexResponse.isAcknowledged();
System.out.println("创建索引返回:" + acknowledged);
//关闭客户端链接
client.close();
}
2)查看索引
@Test
public void getIndex() throws Exception {
RestHighLevelClient client = EsClientUtil.getClient();
// 查询索引-请求对象
GetIndexRequest request = new GetIndexRequest("user");
// 发送请求 获取响应
GetIndexResponse response = client.indices().get(request, RequestOptions.DEFAULT);
Map<String, List<AliasMetadata>> aliases = response.getAliases();
Map<String, MappingMetadata> mappings = response.getMappings();
Map<String, Settings> settings = response.getSettings();
System.out.println("aliases: " + aliases);
System.out.println("mappings: " + mappings);
System.out.println("settings: " + settings);
client.close();
}
3)查看所有索引
@Test
public void getAllIndex() throws Exception {
RestHighLevelClient client = EsClientUtil.getClient();
GetAliasesRequest request = new GetAliasesRequest();
GetAliasesResponse alias = client.indices().getAlias(request, RequestOptions.DEFAULT);
Map<String, Set<AliasMetadata>> aliasesMap = alias.getAliases();
for (String key : aliasesMap.keySet()) {
System.out.println(key);
}
client.close();
}
3)删除索引
@Test
public void deleteIndex() throws Exception {
RestHighLevelClient client = EsClientUtil.getClient();
DeleteIndexRequest request = new DeleteIndexRequest("user");
AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
boolean acknowledged = response.isAcknowledged();
System.out.println("acknowledged:" + acknowledged);
client.close();
}
4、文档操作
1)新增文档
@Test
public void insertDoc() throws Exception {
RestHighLevelClient client = EsClientUtil.getClient();
// 新增文档-请求对象
IndexRequest request = new IndexRequest();
// 设置索引及唯一性标识
request.index("user").id("1001");
// 创建数据对象
User user = new User("张三", 30, "男");
ObjectMapper objectMapper = new ObjectMapper();
String productJson = objectMapper.writeValueAsString(user);
// 添加文档数据,数据格式为json格式
request.source(productJson, 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());
client.close();
}
2)修改文档
@Test
public void updateDoc() throws Exception {
RestHighLevelClient client = EsClientUtil.getClient();
//修改文档-请求对象
UpdateRequest request = new UpdateRequest();
//配置参数
request.index("user").id("1001");
//设置请求体,对数据进行修改
//request.doc(XContentType.JSON, "sex", "女");
request.doc(XContentType.JSON, "sex", "女", "name", "lisi", "age", 10);
// 发送请求 获取响应
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());
client.close();
}
3)查询文档
@Test
public void getDoc() throws Exception {
RestHighLevelClient client = EsClientUtil.getClient();
//创建请求对象
GetRequest request = new GetRequest().index("user").id("1001");
//发送请求 获取响应
GetResponse response = client.get(request, RequestOptions.DEFAULT);
//3.打印结果信息
System.out.println("_index:" + response.getIndex());
System.out.println("_type:" + response.getType());
System.out.println("_id:" + response.getId());
System.out.println("source:" + response.getSourceAsString());
client.close();
}
4)删除文档
@Test
public void deleteDoc() throws Exception {
RestHighLevelClient client = EsClientUtil.getClient();
// 删除请求对象
DeleteRequest deleteRequest = new DeleteRequest().index("user").id("1001");
DeleteResponse response = client.delete(deleteRequest, RequestOptions.DEFAULT);
System.out.println(response.toString());
client.close();
}
5)批量新增文档
@Test
public void bulkInsertDoc() throws Exception {
RestHighLevelClient client = EsClientUtil.getClient();
// 创建批量新增请求对象
BulkRequest request = new BulkRequest();
request.add(new IndexRequest().index("user").id("1001").source(XContentType.JSON, "name", "zhangsan", "age", 5, "sex", "男", "birthday", 1994));
request.add(new IndexRequest().index("user").id("1002").source(XContentType.JSON, "name", "lisi", "age", 10, "sex", "女", "birthday", 1995));
request.add(new IndexRequest().index("user").id("1003").source(XContentType.JSON, "name", "wangwu", "age", 10, "sex", "男", "birthday", 1996));
request.add(new IndexRequest().index("user").id("1004").source(XContentType.JSON, "name", "zhaoliu", "age", 20, "sex", "女", "birthday", 1997));
//发送请求, 获取响应
BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);
System.out.println("took:" + response.getTook());
System.out.println("items:" + Arrays.toString(response.getItems()));
client.close();
}
6)批量删除文档
@Test
public void bulkDeleteDoc() throws Exception {
RestHighLevelClient client = EsClientUtil.getClient();
//创建批量删除请求对象
BulkRequest request = new BulkRequest();
request.add(new DeleteRequest().index("user").id("1001"));
request.add(new DeleteRequest().index("user").id("1002"));
request.add(new DeleteRequest().index("user").id("1003"));
// 发送请求 获取响应
BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);
//打印结果信息
System.out.println("took:" + response.getTook());
System.out.println("items:" + Arrays.toString(response.getItems()));
client.close();
}
5、高级查询
写一个公共的打印结果的方法
/**
* 打印结果
*
* @param response SearchResponse
*/
private void printResult(SearchResponse response) {
// 查询匹配
SearchHits hits = response.getHits();
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());
}
System.out.println("<<========");
}
1)查询所有索引的文档数据
@Test
public void getAllSearch() throws Exception {
RestHighLevelClient client = EsClientUtil.getClient();
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
//request.indices("user", "student"); // 不设置索引, 会查询所有索引下的数据
// 构建查询请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 查询所有数据
sourceBuilder.query(QueryBuilders.matchAllQuery());
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 查询匹配
printResult(response);
client.close();
}
2)term查询-关键字精确查询
@Test
public void getTermSearch() throws Exception {
RestHighLevelClient client = EsClientUtil.getClient();
SearchRequest request = new SearchRequest();
//request.indices("user");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.termQuery("name", "zhangsan"));
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 查询匹配
printResult(response);
client.close();
}
3)分页查询
@Test
public void getPageSearch() throws Exception {
RestHighLevelClient client = EsClientUtil.getClient();
SearchRequest request = new SearchRequest();
request.indices("user");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchAllQuery()); // 查询所有
//设置分页查询
sourceBuilder.from(0); //当前页起始索引(第一条数据的顺序号)
sourceBuilder.size(2); //每页查询条数
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
printResult(response);
client.close();
}
4)数据排序
@Test
public void getSortSearch() throws Exception {
RestHighLevelClient client = EsClientUtil.getClient();
SearchRequest request = new SearchRequest();
request.indices("user");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchAllQuery());
sourceBuilder.sort("age", SortOrder.ASC);
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
printResult(response);
client.close();
}
5)过滤字段
@Test
public void getFilterSearch() throws Exception {
RestHighLevelClient client = EsClientUtil.getClient();
SearchRequest request = new SearchRequest();
request.indices("user");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchAllQuery());
// 查询字段过滤
String[] excludes = {};
String[] includes = {"name", "age"};
sourceBuilder.fetchSource(includes, excludes);
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
printResult(response);
client.close();
}
6)bool查询
@Test
public void getBoolSearch() throws Exception {
RestHighLevelClient client = EsClientUtil.getClient();
SearchRequest request = new SearchRequest();
request.indices("user");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// 必须包含
boolQueryBuilder.must(QueryBuilders.matchQuery("age", 10));
// 一定不包含
boolQueryBuilder.mustNot(QueryBuilders.matchQuery("name", "zhangsan"));
// 可能包含
boolQueryBuilder.should(QueryBuilders.matchQuery("sex", "男"));
sourceBuilder.query(boolQueryBuilder);
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
printResult(response);
client.close();
}
7)范围查询
@Test
public void getRangeSearch() throws Exception {
RestHighLevelClient client = EsClientUtil.getClient();
SearchRequest request = new SearchRequest();
request.indices("user");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").gte(10).lte(30);
sourceBuilder.query(rangeQueryBuilder);
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
printResult(response);
client.close();
}
8)模糊查询
@Test
public void getFuzzySearch() throws Exception {
RestHighLevelClient client = EsClientUtil.getClient();
SearchRequest request = new SearchRequest();
request.indices("user");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.fuzzyQuery("name", "zhangsan").fuzziness(Fuzziness.ONE));
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
printResult(response);
client.close();
}
9)高亮查询
@Test
public void getHighlightSearch() throws Exception {
RestHighLevelClient client = EsClientUtil.getClient();
SearchRequest request = new SearchRequest();
request.indices("user");
//查询请求体 构建器
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//构建查询方式:高亮查询
TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("name", "zhangsan");
// 设置查询方式
sourceBuilder.query(termsQueryBuilder);
//构建高亮字段
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<font color='red'>");//设置标签前缀
highlightBuilder.postTags("</font>");//设置标签后缀
highlightBuilder.field("name");//设置高亮字段
//设置高亮构建对象
sourceBuilder.highlighter(highlightBuilder);
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
printResult(response);
client.close();
}
10)聚合查询
最大值查询
@Test
public void getMaxSearch() throws Exception {
RestHighLevelClient client = EsClientUtil.getClient();
SearchRequest request = new SearchRequest();
request.indices("user");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.aggregation(AggregationBuilders.max("maxAge").field("age"));
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//printResult(response);
SearchHits hits = response.getHits();
System.out.println(response);
client.close();
}
分组统计
@Test
public void getGroupSearch() throws Exception {
RestHighLevelClient client = EsClientUtil.getClient();
SearchRequest request = new SearchRequest();
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.aggregation(AggregationBuilders.terms("age_groupby").field("age"));
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
System.out.println(response);
client.close();
}