ElasticSearch从入门到精通–第二话(原生API调用–纯代码篇)
ElasticSearch从入门到精通–第一话(入门篇)
ElasticSearch从入门到精通–第二话(原生API调用–纯代码篇)
ElasticSearch从入门到精通–第三话(集群环境搭建篇)
ElasticSearch从入门到精通–第四话(核心概念篇)
ElasticSearch从入门到精通–第五话(整合SpringBoot高效开发、分页高亮等、Kibana使用篇)
通过API访问ES服务器
首先创建好一个Java的maven项目,引入好相关的依赖,然后就可以开始了
依赖如下:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.8.2</version>
</dependency>
<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>
</dependencies>
创建测试类进行API访问es即可。
索引
创建
public class ESTEST_Index_Create {
public static void main(String[] args) throws IOException {
// 创建es客户端,指定ip和端口
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
// 创建索引名为 user 的索引
CreateIndexRequest user = new CreateIndexRequest("user");
CreateIndexResponse createIndexResponse = client.indices().create(user, RequestOptions.DEFAULT);
// 响应状态
boolean acknowledged = createIndexResponse.isAcknowledged();
System.out.println(acknowledged);
client.close();
}
}
true
查询
public class ESTEST_Index_Search {
public static void main(String[] args) throws IOException {
// 创建es客户端,指定ip和端口
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
// 创建索引名为 user 的索引
GetIndexRequest user = new GetIndexRequest("user");
GetIndexResponse getIndexResponse = client.indices().get(user, RequestOptions.DEFAULT);
// 响应数据
System.out.println(getIndexResponse.getAliases());
System.out.println(getIndexResponse.getMappings());
System.out.println(getIndexResponse.getSettings());
client.close();
}
}
{user=[]}
{user=org.elasticsearch.cluster.metadata.MappingMetadata@ed47fb9e}
{user={"index.creation_date":"1667202797544",...}}
删除
public class ESTEST_Index_Delete {
public static void main(String[] args) throws IOException {
// 创建es客户端,指定ip和端口
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
// 创建索引名为 user 的索引
DeleteIndexRequest user = new DeleteIndexRequest("user");
AcknowledgedResponse delete = client.indices().delete(user, RequestOptions.DEFAULT);
// 响应
System.out.println(delete.isAcknowledged());
client.close();
}
}
true
文档
新增一个实体类,用作数据模型
@Data
public class User {
private String name;
private Integer age;
private String sex;
}
新增
public class ESTEST_Doc_Insert {
public static void main(String[] args) throws IOException {
// 创建es客户端,指定ip和端口
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
//
IndexRequest request = new IndexRequest();
request.index("user").id("1001");
User user = new User("zhangsan", 30, "男");
// 转json数据
ObjectMapper mapper = new ObjectMapper();
String userJson = mapper.writeValueAsString(user);
request.source(userJson, XContentType.JSON);
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
// 响应数据
System.out.println(response.getResult());
client.close();
}
}
CREATED
修改
public class ESTEST_Doc_Update {
public static void main(String[] args) throws IOException {
// 创建es客户端,指定ip和端口
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
// 创建对应的请求
UpdateRequest request = new UpdateRequest();
request.index("user").id("1001");
request.doc(XContentType.JSON, "sex", "女");
UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
// 响应数据
System.out.println(response.getResult());
client.close();
}
}
UPDATED
查询
public class ESTEST_Doc_Get {
public static void main(String[] args) throws IOException {
// 创建es客户端,指定ip和端口
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
// 查询数据
GetRequest request = new GetRequest();
request.index("user").id("1001");
GetResponse response = client.get(request, RequestOptions.DEFAULT);
// 响应
System.out.println(response.getSourceAsString());
client.close();
}
}
{"name":"zhangsan","age":30,"sex":"女"}
删除
public class ESTEST_Doc_Delete {
public static void main(String[] args) throws IOException {
// 创建es客户端,指定ip和端口
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
// 查询数据
DeleteRequest request = new DeleteRequest();
request.index("user").id("1001");
DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
// 响应
System.out.println(response.toString());
client.close();
}
}
DeleteResponse[index=user,type=_doc,id=1001,version=3,result=deleted,shards=ShardInfo{total=2, successful=1, failures=[]}]
批量新增
public class ESTEST_Doc_Insert_Batch {
public static void main(String[] args) throws IOException {
// 创建es客户端,指定ip和端口
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
// 批量插入数据
BulkRequest request = new BulkRequest();
request.add(new IndexRequest().index("user").id("1001").source(XContentType.JSON, "name", "zhangsan"));
request.add(new IndexRequest().index("user").id("1002").source(XContentType.JSON, "name", "lisi"));
request.add(new IndexRequest().index("user").id("1003").source(XContentType.JSON, "name", "wangwu"));
BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);
System.out.println(response.getTook());
System.out.println(Arrays.toString(response.getItems()));
client.close();
}
}
718ms
[org.elasticsearch.action.bulk.BulkItemResponse@3541cb24, org.elasticsearch.action.bulk.BulkItemResponse@2177849e, org.elasticsearch.action.bulk.BulkItemResponse@40cb8df7]
批量删除
public class ESTEST_Doc_Delete_Batch {
public static void main(String[] args) throws IOException {
// 创建es客户端,指定ip和端口
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
// 查询数据
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(response.getTook());
System.out.println(Arrays.toString(response.getItems()));
client.close();
}
}
693ms
[org.elasticsearch.action.bulk.BulkItemResponse@7a675056, org.elasticsearch.action.bulk.BulkItemResponse@d21a74c, org.elasticsearch.action.bulk.BulkItemResponse@6e509ffa]
高级查询
全量查询
public class ESTEST_Doc_Query {
public static void main(String[] args) throws IOException {
// 创建es客户端,指定ip和端口
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
// 查询索引中,全部的数据
SearchRequest request = new SearchRequest();
request.indices("user");
request.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 响应
System.out.println(response.getHits().getTotalHits());
System.out.println(response.getTook());
for (SearchHit hit : response.getHits()) {
System.out.println(hit.getSourceAsString());
}
client.close();
}
}
6 hits
399ms
{"name":"zhangsan","age":30,"sex":"男"}
{"name":"lisi","age":40,"sex":"女"}
{"name":"wangwu1","age":50,"sex":"男"}
{"name":"wangwu2","age":60,"sex":"女"}
{"name":"wangwu3","age":40,"sex":"男"}
{"name":"wangwu4","age":30,"sex":"男"}
条件查询
和上文中代码一致,需要将部分代码修改,查询30岁的人
request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("age", 30)));
2 hits
3ms
{"name":"zhangsan","age":30,"sex":"男"}
{"name":"wangwu4","age":30,"sex":"男"}
分页查询
public class ESTEST_Doc_Query {
public static void main(String[] args) throws IOException {
// 创建es客户端,指定ip和端口
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
// 查询所有
SearchRequest request = new SearchRequest();
request.indices("user");
SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
// 分页处理
builder.from(0);
builder.size(2);
request.source(builder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 响应
System.out.println(response.getHits().getTotalHits());
System.out.println(response.getTook());
for (SearchHit hit : response.getHits()) {
System.out.println(hit.getSourceAsString());
}
client.close();
}
}
6 hits
2ms
{"name":"zhangsan","age":30,"sex":"男"}
{"name":"lisi","age":40,"sex":"女"}
结果排序
public class ESTEST_Doc_Query {
public static void main(String[] args) throws IOException {
// 创建es客户端,指定ip和端口
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
// 查询所有
SearchRequest request = new SearchRequest();
request.indices("user");
SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
// 排序
builder.sort("age", SortOrder.DESC);
request.source(builder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 响应
System.out.println(response.getHits().getTotalHits());
System.out.println(response.getTook());
for (SearchHit hit : response.getHits()) {
System.out.println(hit.getSourceAsString());
}
client.close();
}
}
6 hits
73ms
{"name":"wangwu2","age":60,"sex":"女"}
{"name":"wangwu1","age":50,"sex":"男"}
{"name":"lisi","age":40,"sex":"女"}
{"name":"wangwu3","age":40,"sex":"男"}
{"name":"zhangsan","age":30,"sex":"男"}
{"name":"wangwu4","age":30,"sex":"男"}
过滤字段
public class ESTEST_Doc_Query {
public static void main(String[] args) throws IOException {
// 创建es客户端,指定ip和端口
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
// 查询所有
SearchRequest request = new SearchRequest();
request.indices("user");
SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
// 设置只返回name
String[] includes = {
"name"};
builder.fetchSource(includes, null);
request.source(builder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 响应
System.out.println(response.getHits().getTotalHits());
System.out.println(response.getTook());
for (SearchHit hit : response.getHits()) {
System.out.println(hit.getSourceAsString());
}
client.close();
}
}
6 hits
5ms
{"name":"zhangsan"}
{"name":"lisi"}
{"name":"wangwu1"}
{"name":"wangwu2"}
{"name":"wangwu3"}
{"name":"wangwu4"}
组合查询
public class ESTEST_Doc_Query {
public static void main(String[] args) throws IOException {
// 创建es客户端,指定ip和端口
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
// 查询所有
SearchRequest request = new SearchRequest();
request.indices("user");
SearchSourceBuilder builder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// must是and should是or
boolQueryBuilder.must(QueryBuilders.matchQuery("age", 30));
boolQueryBuilder.must(QueryBuilders.matchQuery("sex", "男"));
builder.query(boolQueryBuilder);
request.source(builder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 响应
System.out.println(response.getHits().getTotalHits());
System.out.println(response.getTook());
for (SearchHit hit : response.getHits()) {
System.out.println(hit.getSourceAsString());
}
client.close();
}
}
2 hits
31ms
{"name":"zhangsan","age":30,"sex":"男"}
{"name":"wangwu4","age":30,"sex":"男"}
非条件写法
boolQueryBuilder.mustNot(QueryBuilders.matchQuery("sex", "男"));
or写法,年龄30 or 40
boolQueryBuilder.should(QueryBuilders.matchQuery("age", 30));
boolQueryBuilder.should(QueryBuilders.matchQuery("age", 40));
范围查询
public class ESTEST_Doc_Query {
public static void main(String[] args) throws IOException {
// 创建es客户端,指定ip和端口
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
// 查询所有
SearchRequest request = new SearchRequest();
request.indices("user");
SearchSourceBuilder builder = new SearchSourceBuilder();
RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age");
// 30 =< age <= 40
rangeQuery.gte(30);
rangeQuery.lte(40);
builder.query(rangeQuery);
request.source(builder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 响应
System.out.println(response.getHits().getTotalHits());
System.out.println(response.getTook());
for (SearchHit hit : response.getHits()) {
System.out.println(hit.getSourceAsString());
}
client.close();
}
}
4 hits
12ms
{"name":"zhangsan","age":30,"sex":"男"}
{"name":"lisi","age":40,"sex":"女"}
{"name":"wangwu3","age":40,"sex":"男"}
{"name":"wangwu4","age":30,"sex":"男"}
模糊查询
public class ESTEST_Doc_Query {
public static void main(String[] args) throws IOException {
// 创建es客户端,指定ip和端口
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
// 查询所有
SearchRequest request = new SearchRequest();
request.indices("user");
SearchSourceBuilder builder = new SearchSourceBuilder();
// 模糊查询wangwu,且 字符偏差为 1 的数据
builder.query(QueryBuilders.fuzzyQuery("name", "wangwu").fuzziness(Fuzziness.ONE));
request.source(builder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 响应
System.out.println(response.getHits().getTotalHits());
System.out.println(response.getTook());
for (SearchHit hit : response.getHits()) {
System.out.println(hit.getSourceAsString());
}
client.close();
}
}
4 hits
36ms
{"name":"wangwu1","age":50,"sex":"男"}
{"name":"wangwu2","age":60,"sex":"女"}
{"name":"wangwu3","age":40,"sex":"男"}
{"name":"wangwu4","age":30,"sex":"男"}
高亮查询
public class ESTEST_Doc_Query {
public static void main(String[] args) throws IOException {
// 创建es客户端,指定ip和端口
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
// 查询所有
SearchRequest request = new SearchRequest();
request.indices("user");
SearchSourceBuilder builder = new SearchSourceBuilder();
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "zhangsan");
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<font color='red'>");
highlightBuilder.postTags("</font>");
highlightBuilder.field("name");
builder.highlighter(highlightBuilder);
builder.query(termQueryBuilder);
request.source(builder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 响应
System.out.println(response.getHits().getTotalHits());
System.out.println(response.getTook());
for (SearchHit hit : response.getHits()) {
// 打印高亮字段
System.out.println(hit.getHighlightFields());
}
client.close();
}
}
1 hits
4ms
{name=[name], fragments[[<font color='red'>zhangsan</font>]]}
最大值查询
public class ESTEST_Doc_Query {
public static void main(String[] args) throws IOException {
// 创建es客户端,指定ip和端口
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
// 查询所有
SearchRequest request = new SearchRequest();
request.indices("user");
SearchSourceBuilder builder = new SearchSourceBuilder();
MaxAggregationBuilder aggregationBuilder = AggregationBuilders.max("maxAge").field("age");
builder.aggregation(aggregationBuilder);
request.source(builder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 响应
System.out.println(response.getHits().getTotalHits());
System.out.println(response.getTook());
System.out.println(new ObjectMapper().writeValueAsString(response.getAggregations()));
client.close();
}
}
6 hits
1ms
{"asMap":{"maxAge":{"name":"maxAge","metadata":null,"value":60.0,"valueAsString":"60.0","type":"max","fragment":true}},"fragment":true}
分组查询
和上文基本一致,只是改了部分代码
TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("ageGroup").field("age");
builder.aggregation(termsAggregationBuilder);
6 hits
17ms
{"asMap":{"ageGroup":{"name":"ageGroup","metadata":null,"buckets":[{"aggregations":{"asMap":{},"fragment":true},"keyAsString":"30","docCount":2,"docCountError":0,"key":30,"keyAsNumber":30,"fragment":true},{"aggregations":{"asMap":{},"fragment":true},"keyAsString":"40","docCount":2,"docCountError":0,"key":40,"keyAsNumber":40,"fragment":true},{"aggregations":{"asMap":{},"fragment":true},"keyAsString":"50","docCount":1,"docCountError":0,"key":50,"keyAsNumber":50,"fragment":true},{"aggregations":{"asMap":{},"fragment":true},"keyAsString":"60","docCount":1,"docCountError":0,"key":60,"keyAsNumber":60,"fragment":true}],"type":"lterms","docCountError":0,"sumOfOtherDocCounts":0,"fragment":true}},"fragment":true}