您当前的位置: 首页 >  Java

java持续实践

暂无认证

  • 5浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

es 7.x JavaAPI 文档 条件查询 分页查询 排序查询 字段查询

java持续实践 发布时间:2022-01-16 15:35:45 ,浏览量:5

文章目录
      • 条件查询
      • 分页查询
      • 排序查询
      • 字段查询

条件查询

条件查询, 只查询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”}

关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

0.2997s