分页+排序功能。
ES每次返回的数据默认最多是10条,可以认为是一页的数据,这个数据量是可以控制的 核心代码如下:
//分页
//设置每页的起始位置,默认是0
searchSourceBuilder.from(0);
//设置每页的数据量,默认是10
searchSourceBuilder.size(10);
在返回满足条件的结果之前,可以按照指定的要求对数据进行排序,默认是按照搜索条件的匹配度返回数据的。 核心代码如下:
//排序
//按照age字段,倒序排序
searchSourceBuilder.sort("age", SortOrder.DESC);
//注意:age字段是数字类型,不需要分词,name字段是字符串类型(Text),默认会被分词,所以不支持排序和聚合操作
//如果想要根据这些会被分词的字段进行排序或者聚合,需要指定使用他们的keyword类型,这个类型表示不会对数据分词
searchSourceBuilder.sort("name.keyword", SortOrder.DESC);
//keyword类型的特性其实也适用于精确查询的场景,可以在matchQuery中指定字段的keyword类型实现精确查询,不管在建立索引的时候有没有被分词都不影响使用
searchSourceBuilder.query(QueryBuilders.matchQuery("name.keyword", "刘德华"));
Java代码实现如下:
package com.simoniu.db_elasticsearch.filter;
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.Operator;
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;
/**
* Search详解
* Created by simoniu
*/
public class EsFilterOperateDemo {
public static void main(String[] args) throws Exception {
//获取RestClient连接
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("master", 9200, "http"),
new HttpHost("slave1", 9200, "http"),
new HttpHost("slave2", 9200, "http")));
SearchRequest searchRequest = new SearchRequest();
//指定索引库,支持指定一个或者多个,也支持通配符,例如:user*
searchRequest.indices("myschool");
//设置搜索类型
//searchRequest.searchType(SearchType.DEFAULT);
//searchRequest.searchType(SearchType.DFS_QUERY_THEN_FETCH);
//指定查询条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//查询所有,可以不指定,默认就是查询索引库中的所有数据
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
//分页
//设置每页的起始位置,默认是0
searchSourceBuilder.from(0);
//设置每页的数据量,默认是10
searchSourceBuilder.size(17);
//排序
//按照age字段,倒序排序
searchSourceBuilder.sort("age", SortOrder.DESC);
//注意:age字段是数字类型,不需要分词,name字段是字符串类型(Text),默认会被分词,所以不支持排序和聚合操作
//如果想要根据这些会被分词的字段进行排序或者聚合,需要指定使用他们的keyword类型,这个类型表示不会对数据分词
//searchSourceBuilder.sort("name.keyword", SortOrder.DESC);
//keyword类型的特性其实也适用于精确查询的场景,可以在matchQuery中指定字段的keyword类型实现精确查询,不管在建立索引的时候有没有被分词都不影响使用
searchSourceBuilder.query(QueryBuilders.matchQuery("name.keyword", "刘德华"));
//设置 SearchSourceBuilder
searchRequest.source(searchSourceBuilder);
//执行查询操作
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
//获取查询返回的结果
SearchHits hits = searchResponse.getHits();
//获取数据总量
long numHits = hits.getTotalHits().value;
System.out.println("数据总数:"+numHits);
//获取具体内容
SearchHit[] searchHits = hits.getHits();
//迭代解析具体内容
for (SearchHit hit : searchHits) {
String sourceAsString = hit.getSourceAsString();
System.out.println(sourceAsString);
}
//关闭连接
client.close();
}
}