- 条件查询
- 分页查询
- 排序查询
- 字段查询
条件查询, 只查询age是30的. 主要是使用 QueryBuilders.termQuery
构造条件和值.
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
/**
* @author:
* 创建时间:2022/1/11 21:05
*/
public class ESTest_Doc_Query {
public static void main(String[] args) throws Exception {
RestHighLevelClient esClient = null;
// 创建ES客户端
try {
esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("127.0.0.1", 9200, "http"))
);
SearchRequest request = new SearchRequest();
request.indices("user");
// 条件查询 termQuery 只查询age是30的
request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("age", 30)));
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());
}
} finally {
if (esClient != null) {
// 关闭ES客户端
esClient.close();
}
}
}
}
查询结果如下 :
2 hits 2ms {“name”:“zhangsan”,“age”:30,“sex”:“男”} {“name”:“lisi”,“age”:30,“sex”:“女”}
分页查询使用SearchSourceBuilder
的from size 来控制分页. 一页查询2条.
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
/**
* @author:
* 创建时间:2022/1/11 21:05
*/
public class ESTest_Doc_Query {
public static void main(String[] args) throws Exception {
RestHighLevelClient esClient = null;
// 创建ES客户端
try {
esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("127.0.0.1", 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 = 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());
}
} finally {
if (esClient != null) {
// 关闭ES客户端
esClient.close();
}
}
}
}
查询结果如下 :
9 hits 3ms {“name”:“zhangsan”,“age”:30,“sex”:“男”} {“name”:“lisi”,“age”:30,“sex”:“女”}
修改 from size
builder.from(2); builder.size(2);
再次执行, 结果为
{“name”:“wangwu”,“age”:40,“sex”:“男”} {“name”:“wangwu1”,“age”:40,“sex”:“女”}
排序查询根据age, 倒序排序查询
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
/**
* @author:
* 创建时间:2022/1/11 21:05
*/
public class ESTest_Doc_Query {
public static void main(String[] args) throws Exception {
RestHighLevelClient esClient = null;
// 创建ES客户端
try {
esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("127.0.0.1", 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 = 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());
}
} finally {
if (esClient != null) {
// 关闭ES客户端
esClient.close();
}
}
}
}
字段查询
如果只想查询某个字段, 或者过掉不需要的字段, 可以用字段查询.
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
/**
* @author:
* 创建时间:2022/1/11 21:05
*/
public class ESTest_Doc_Query {
public static void main(String[] args) throws Exception {
RestHighLevelClient esClient = null;
// 创建ES客户端
try {
esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("127.0.0.1", 9200, "http"))
);
SearchRequest request = new SearchRequest();
request.indices("user");
// 字段查询
SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
String[] includes = {"age"};
String[] excludes = {};
builder.fetchSource(includes, excludes);
request.source(builder);
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());
}
} finally {
if (esClient != null) {
// 关闭ES客户端
esClient.close();
}
}
}
}
使用 builder.fetchSource
方法, 传入需要的字段和不需要的字段. 例如上面的例子中, 只查询age字段. 查询结果如下
{“age”:30} {“age”:30} {“age”:40} {“age”:40} {“age”:50} {“age”:50} {“age”:60} {“age”:60} {“age”:60}
如果把age放入excludes
数组中, 即修改代码如下
String[] includes = {}; String[] excludes = {“age”}; builder.fetchSource(includes, excludes);
查询结果如下 : 只过滤了 age字段.
{“sex”:“男”,“name”:“zhangsan”} {“sex”:“女”,“name”:“lisi”} {“sex”:“男”,“name”:“wangwu”} {“sex”:“女”,“name”:“wangwu1”} {“sex”:“男”,“name”:“wangwu2”} {“sex”:“男”,“name”:“wangwu3”} {“sex”:“男”,“name”:“wangwu44”} {“sex”:“男”,“name”:“wangwu555”} {“sex”:“男”,“name”:“wangwu66666”}