elasticsearch java api 学习笔记(7.15.0)
Java API 环境准备
- 新建maven 工程,并将所需依赖引入:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
<!-- elastic 相关依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
- 初始化一个配置类,在Spring 中初始化一个Bean ,这个Bean 具有连接elasticsearch 的作用。在用到连接数据库的时候,直接从Spring 中拿(由于会频繁的用到Elasticsearch 连接和关闭的功能,所以将他的创建权交给Spring,我们不去每次都进行连接操作和关闭操作了)。
package com.lbk.config;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ElasticSearchConfig {
@Bean
public RestHighLevelClient restHighLevelClient() {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http")));
return client;
}
}
- 然后新建一个测试类ESTest ,之后所有对Elasticsearch 的操作测试都在这里进行
public class ESTest {
@Autowired
@Qualifier("restHighLevelClient")
private RestHighLevelClient client;
@Test
// 测试创建索引
void testCreateIndex() throws IOException {
...
}
...
}
Java API 的各种操作
1. 对索引的操作
- 创建索引
@Test
// 测试创建索引
void testCreateIndex() throws IOException {
// 创建索引
CreateIndexRequest createIndexRequest = new CreateIndexRequest("user-lbk2");
// 发送请求 ,获得响应
CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
boolean acknowledged = createIndexResponse.isAcknowledged();
System.out.println("操作状态 = " + acknowledged);
// 关闭客户端连接
client.close();
}
@Test
// 测试查询索引
void testSearchIndex() throws IOException {
// 查询索引,创建对象
GetIndexRequest getIndexRequest = new GetIndexRequest("user-lbk");
// 发送请求,获取响应
GetIndexResponse getIndexResponse = client.indices().get(getIndexRequest, RequestOptions.DEFAULT);
System.out.println(getIndexResponse.getAliases());
System.out.println(getIndexResponse.getMappings());
System.out.println(getIndexResponse.getIndices());
// 关闭客户端连接
client.close();
}
@Test
// 测试删除索引
void delIndex() throws IOException {
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("user-lbk2");
AcknowledgedResponse response = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
System.out.println("操作结果= " + response.isAcknowledged());
}
2. 对文档的操作
@Test
// 测试文档的新增
void testDocAdd() throws IOException {
// 封装请求体
IndexRequest indexRequest = new IndexRequest("user-lbk");
User user = new User("zhangsan",245);
indexRequest.id("1001");
indexRequest.source(JSON.toJSONString(user), XContentType.JSON);
// 发送请求, 获得响应
IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT);
System.out.println(response.status());
System.out.println(response.toString());
}
@Test
// 测试文档的修改
void testDocUpdate() throws IOException {
// 修改文档的请求对象
UpdateRequest updateRequest = new UpdateRequest();
// 封装请求体,配置参数
updateRequest.index("user-lbk").id("1001");
updateRequest.doc(XContentType.JSON, "name", "lbk2");
// 发送请求,获取响应
UpdateResponse updateResponse = client.update(updateRequest,RequestOptions.DEFAULT);
// 打印响应结果
System.out.println("status: " + updateResponse.status());
System.out.println("_index: " + updateResponse.getIndex());
System.out.println("_result: " + updateResponse.getResult());
}
@Test
// 测试文档的删除
void testDocDel() throws IOException {
DeleteRequest deleteRequest = new DeleteRequest("user-lbk");
deleteRequest.id("1001");
DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
// 打印信息
System.out.println(deleteResponse.status());
}
@Test
// 测试文档的查询
void testDocSearch() throws IOException {
// 创建请求对象
GetRequest getRequest = new GetRequest().index("user-lbk").id("1001");
// 客户段发送请求,返回响应对象
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
// 打印返回结果
System.out.println("_source:" + getResponse.getSource());
System.out.println("_index:" + getResponse.getIndex());
System.out.println("_source:" + getResponse.getSourceAsString());
}
3. 对文档进行批量操作
@Test
// 测试文档的批量添加
void testBatchDocAdd() throws IOException {
// 创建批量新增请求对象
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.add(new IndexRequest().index("user-lbk").id("2002").source(XContentType.JSON,"name","赵雷","age",30));
bulkRequest.add(new IndexRequest().index("user-lbk").id("2003").source(XContentType.JSON,"name","艾怡良","age",20));
bulkRequest.add(new IndexRequest().index("user-lbk").id("2004").source(XContentType.JSON,"name","单依纯","age",18));
bulkRequest.add(new IndexRequest().index("user-lbk").id("2005").source(XContentType.JSON,"name","宋东野","age",45));
bulkRequest.add(new IndexRequest().index("user-lbk").id("2006").source(XContentType.JSON,"name","马頔","age",30));
// 客户端发送请求,获取响应对象
BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println("took:" + bulkResponse.getTook());
System.out.println("items:" + bulkResponse.getItems());
}
@Test
// 测试文档的批量删除
void testBatchDocDel() throws IOException {
// 创建批量删除请求对象
BulkRequest bulkRequest = new BulkRequest();
// 封装请求体
bulkRequest.add(new DeleteRequest("user-lbk").id("2002"));
bulkRequest.add(new DeleteRequest("user-lbk").id("2003"));
bulkRequest.add(new DeleteRequest("user-lbk").id("2004"));
bulkRequest.add(new DeleteRequest("user-lbk").id("2005"));
bulkRequest.add(new DeleteRequest("user-lbk").id("2006"));
// 客户端发送请求,获取响应对象
BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
// 打印结果信息
System.out.println("took:" + bulkResponse.getTook());
System.out.println("items:" + bulkResponse.getItems());
}
4. 高级查询
@Test
// 查询所有数据
void testQueryAll() throws IOException {
// 构建搜索请求对象
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("user-lbk");
// 构建查询的请求体
SearchSourceBuilder builder = new SearchSourceBuilder();
// 查询所有的数据
builder.query(QueryBuilders.matchAllQuery());
searchRequest.source(builder);
// 发送请求,获得响应
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
// 查询匹配
SearchHits hits = response.getHits();
System.out.println("took:" + response.getTook());
System.out.println("total:" + hits.getTotalHits());
System.out.println(" hits ==================");
// 将每条查询到的数据以字符串形式输出
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}
@Test
// 条件查询
void testQueryDocByCondiTion() throws IOException {
// 构架查询的请求对象
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("user-lbk");
// 构建查询条件的条件体
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(QueryBuilders.termQuery("name","zhangsan"));
searchRequest.source(builder);
// 发送请求,获得响应
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
// 输出返回结果
SearchHits hits = response.getHits();
System.out.println("took:" + response.getTook());
System.out.println("total:" + hits.getTotalHits());
System.out.println("=============================");
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}
@Test
// 分页查询
void testSearchPage() throws IOException {
// 构建查询的请求对象
SearchRequest searchRequest = new SearchRequest("user-lbk");
// 构建查询的请求体
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(QueryBuilders.matchAllQuery());
// 构建分页
builder.from(0);
builder.size(2);
// 将请求体放到请求对象中
searchRequest.source(builder);
// 发送请求,获取响应
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
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("=====================");
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}
@Test
// 查询排序
void testSearchAndOrder() throws IOException {
// 构建查询的请求对象
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("user-lbk");
// 构建请求体
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(QueryBuilders.matchAllQuery());
// 排序 ASC 增序 DESC 降序
builder.sort("age", SortOrder.DESC);
// 将请求体放到请求中
searchRequest.source(builder);
// 发送请求,获得响应
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}
@Test
// 组合查询
void testSearchAndOrNot() throws IOException {
// 构建请求对象
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("user-lbk");
// 构建请求对象
SearchSourceBuilder builder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// 必须包含 must ; 必须不包含 mustNot
// boolQueryBuilder.mustNot(QueryBuilders.matchQuery("age","18"));
// 可能包含
boolQueryBuilder.should(QueryBuilders.matchQuery("age","20"));
builder.query(boolQueryBuilder);
// 将请求体放到请求中
searchRequest.source(builder);
// 发送请求,返回响应
SearchResponse response = client.search(searchRequest,RequestOptions.DEFAULT);
SearchHits hits = response.getHits();
System.out.println("======================");
System.out.println("took:" + response.getTook());
System.out.println("total:" + hits.getTotalHits());
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
System.out.println(hit.getScore());
}
}
@Test
// 范围查询
void testSearchLimit() throws IOException {
SearchRequest searchRequest = new SearchRequest("user-lbk");
SearchSourceBuilder builder = new SearchSourceBuilder();
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age");
rangeQueryBuilder.lte("40");
rangeQueryBuilder.gte("10");
builder.query(rangeQueryBuilder);
searchRequest.source(builder);
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
System.out.println("score:" + hit.getScore());
System.out.println(hit.getSourceAsString());
}
}
@Test
// 模糊查询
void testSearchFuzzy() throws IOException {
SearchRequest searchRequest = new SearchRequest("user-lbk");
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(QueryBuilders.fuzzyQuery("name","宋").fuzziness(Fuzziness.ONE));
searchRequest.source(builder);
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = response.getHits();
System.out.println("maxScore:" + hits.getMaxScore());
System.out.println("took:" + response.getTook());
System.out.println("total:" + hits.getTotalHits());
for (SearchHit hit : hits) {
System.out.println("score:" + hit.getScore());
System.out.println(hit.getSourceAsString());
}
}
@Test
// 高亮查询
void testSearchHighlight() throws IOException {
// 创建请求对象
SearchRequest searchRequest = new SearchRequest("user-lbk");
// 创建请求体
SearchSourceBuilder builder = new SearchSourceBuilder();
// 构建查询方式
/*
* 这里关于中文查不到的情况找到了 用 name.keywword 的方法
* 或者是将 term 换成 matchPhraseQuery
* */
MatchPhraseQueryBuilder matchPhraseQueryBuilder = QueryBuilders.matchPhraseQuery("name", "单依纯");
// 将查询方式放入请求体中
builder.query(matchPhraseQueryBuilder);
// 开始构建高亮字段
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<font color='red'>");
highlightBuilder.postTags("</font>");
highlightBuilder.field("name.keyword");
// 将高亮对象放入请求体中
builder.highlighter(highlightBuilder);
// 将请求体放入请求对象中
searchRequest.source(builder);
// 客户端发送请求,获取响应对象
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
// 打印响应结果
SearchHits hits = response.getHits();
System.out.println("took:" + response.getTook());
System.out.println("total:" + hits.getTotalHits());
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
System.out.println(sourceAsString);
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
System.out.println(highlightFields);
}
}
@Test
// 最大值查询
void testSearchMax() throws IOException {
SearchRequest searchRequest = new SearchRequest().indices("user-lbk");
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.aggregation(AggregationBuilders.max("maxAge").field("age"));
// 设置请求体
searchRequest.source(builder);
// 发送请求,获取响应对象
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
// 打印响应数据
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits());
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}
@Test
//分组查询
void testSearchGroup() throws IOException {
SearchRequest searchRequest = new SearchRequest("user-lbk");
SearchSourceBuilder builder = new SearchSourceBuilder();
// 设置请求体
builder.aggregation(AggregationBuilders.terms("age_groupby").field("age"));
searchRequest.source(builder);
// 请求客户端 ,获取响应对象
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}
总结
通过以上的方法,可以实现对elasticsearch 进行简单的增删改查、数据的批量增加和批量删除;可以完成一些高级查询,如聚合、分组等。