← 返回首页
分页+排序功能
发表时间:2024-01-05 06:13:13
分页+排序功能

分页+排序功能。

1.分页

ES每次返回的数据默认最多是10条,可以认为是一页的数据,这个数据量是可以控制的 核心代码如下:

//分页
//设置每页的起始位置,默认是0
searchSourceBuilder.from(0);
//设置每页的数据量,默认是10
searchSourceBuilder.size(10);

2.排序

在返回满足条件的结果之前,可以按照指定的要求对数据进行排序,默认是按照搜索条件的匹配度返回数据的。 核心代码如下:

//排序
//按照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();
    }
}