elasticsearch查询操作(API方式)

说明:elasticsearch查询操作除了使用DSL语句的方式(参考:http://t.csdn.cn/k7IGL),也可以使用API的方式。

准备

使用前需先导入依赖

xml 复制代码
	<!--RestHighLevelClient依赖-->
	<dependency>
	    <groupId>org.elasticsearch.client</groupId>
	    <artifactId>elasticsearch-rest-high-level-client</artifactId>
	</dependency>

创建一个测试类,查询操作代码都写在测试类里面,首先先建立RestHighLevelClient的连接

java 复制代码
    /**
     * 定义连接
     */
    private RestHighLevelClient client;

    /**
     * 初始化客户端
     */
    @BeforeEach
    public void init(){
        client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://服务器IP地址:9200")));
    }

    /**
     * 关闭客户端
     * @throws IOException
     */
    @AfterEach
    public void close() throws IOException {
        client.close();
    }

1、模糊查询

(1)全部查询;

查询student索引库的所有文档;

java 复制代码
    /**
     * 1.1 全部查询
     * @throws IOException
     */
    @Test
    public void queryMatchAll() throws IOException {
        // 1.创建请求
        SearchRequest request = new SearchRequest("student");

        // 2.编写DSL语句
        request.source().equals(QueryBuilders.matchAllQuery());

        // 3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 4.解析返回值,并打印
        SearchHits hits = response.getHits();

        // 遍历his
        for (SearchHit hit : hits) {

            // 获取字符串
            String json = hit.getSourceAsString();

            // 解析字符串成对象
            StudentDoc studentDoc = JSON.parseObject(json, StudentDoc.class);

            // 打印
            System.out.println("studentDoc = " + studentDoc);
    }

可以看到,API方式的全查默认还是值返回前10条;

把解析返回值的代码抽取出来成一个方法,方便后面使用

java 复制代码
    /**
     * 解析返回值并打印
     * @param response
     */
    private void parseJson(SearchResponse response) {
        // 获取his数据
        SearchHits hits = response.getHits();

        // 遍历his
        for (SearchHit hit : hits) {

            // 获取字符串
            String json = hit.getSourceAsString();

            // 解析字符串成对象
            StudentDoc studentDoc = JSON.parseObject(json, StudentDoc.class);

            // 打印
            System.out.println("studentDoc = " + studentDoc);
        }
    }

(2)单字段查询;

例如,查询all字段值为马尔克斯的文档;

java 复制代码
    /**
     * 1.2 单字段查询
     * @throws IOException
     */
    @Test
    public void queryMatch() throws IOException {
        // 1.创建请求
        SearchRequest request = new SearchRequest("student");

        // 2.编写DSL语句
        request.source().query(QueryBuilders.matchQuery("all","马尔克斯"));

        // 3.发送请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);

        // 4.解析返回值,并打印
        parseJson(search);
    }

代码执行完成,查询成功;

(3)多字段查询;

例如,查询name、username和gender字段值包括"陀"的文档;

java 复制代码
	/**
     * 1.3 多字段查询
     * @throws IOException
     */
    @Test
    public void multiMatchQuery() throws IOException {
        // 1.创建请求
        SearchRequest request = new SearchRequest("student");

        // 2.创建DSL语句
        request.source().query(QueryBuilders.multiMatchQuery("陀","name","username","gender"));

        // 3.发送请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);

        // 4.解析返回值,并打印
        parseJson(search);
    }

代码执行完成,查询成功;

2、精确查询

(1)term查询;

例如,查询name值为杜甫的文档;

java 复制代码
	/**
     * 2.1 term查询
     * @throws IOException
     */
    @Test
    public void termQuery() throws IOException {
        // 1.创建请求
        SearchRequest request = new SearchRequest("student");

        // 2.创建DSL语句
        request.source().query(QueryBuilders.termQuery("name","杜甫"));

        // 3.发送请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);

        // 4.解析返回值,并打印
        parseJson(search);
    }

查询完成;

(2)range查询;

例如,查询job大于1,小于等于3的文档;

java 复制代码
    /**
     *  2.2 range查询
     * @throws IOException
     */
    @Test
    public void rangeQuery() throws IOException {
        // 1.创建请求
        SearchRequest request = new SearchRequest("student");

        // 2.编写DSL语句
        request.source().query(QueryBuilders.rangeQuery("job").gt(1).lte(3));

        // 3.发送请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);

        // 4.解析返回值,并打印
        parseJson(search);
    }

查询完成;

3、复合查询

例如,查询all字段为萨特,并且job≥2,≤4的文档;

java 复制代码
	/**
     * 3. 复合查询
     * @throws IOException
     */
    @Test
    public void booleanQuery() throws IOException {
        // 1.创建请求
        SearchRequest request = new SearchRequest("student");

        // 2.编写DSL语句
        request.source().query(QueryBuilders.boolQuery()
                .must(QueryBuilders.matchQuery("all","萨特"))
                .filter(QueryBuilders.rangeQuery("job").gte(2).lte(4)));

        // 3.发送请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);

        // 4.解析返回值,并打印
        parseJson(search);
    }

查询完成,因为萨特的job=1,所以未查询出来;

更换job条件为≥1,再查询,可以查询出来;

4、分页、排序查询

例如,查询job≥1,≤4,按照job降序排序,并且从第2条文档开始,往后取8条;

java 复制代码
/**
     * 4. 分页、排序查询
     * @throws IOException
     */
    @Test
    public void queryByPageAndSort() throws IOException {
        // 1.创建请求
        SearchRequest request = new SearchRequest("student");

        // 2.编写DSL语句
        request.source().query(QueryBuilders.rangeQuery("job").gte(1).lte(4));

        // 3.分页查询,查询从第2条开始,往后8条
        request.source().from(2).size(8);

        // 4.排序
        request.source().sort("job", SortOrder.DESC);

        // 5.发送请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);

        // 6.解析返回值,并打印
        parseJson(search);
    }

全部符合条件的记录;

分页、排序查询后,可以看到只有当前页的内容,并且job按照升序排序;

从结果可以看出,from()中的索引是从0开始的,from(2)表示从第三条开始计算;

5、高亮查询

例如,把name等于关羽的文档,name字段的值设置为斜体(em);

java 复制代码
    /**
     * 6.高亮显示
     */
    @Test
    public void heightLight() throws Exception {
        // 1.创建请求
        SearchRequest request = new SearchRequest("student");

        // 2.编写DSL语句
        request.source().query(QueryBuilders.matchQuery("name","关羽"));

        // 3.声明高亮显示
        request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));

        // 4.发送请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);

        // 5.解析返回值
        SearchHits hits = search.getHits();

        // 6.遍历his
        for (SearchHit hit : hits) {

            // 7.获取字符串
            String json = hit.getSourceAsString();

            // 8.解析字符串成对象
            StudentDoc studentDoc = JSON.parseObject(json, StudentDoc.class);

            // 9.获取高亮字段
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();

            // 10.判断高亮字段不能为空
            if (!CollectionUtils.isEmpty(highlightFields)) {

                // 11.获取高亮字段值
                HighlightField highlightField = highlightFields.get("name");

                // 12.判断高亮字段值不等于空
                if (highlightField != null){

                    // 13.获取高亮字段值
                    String heightFightName = highlightField.getFragments()[0].string();

                    // 14.将高亮字段值重新赋值给对象并打印
                    studentDoc.setName(heightFightName);
                    
                    System.out.println("studentDoc = " + studentDoc);
                }
            }
        }
    }

执行代码,可以看到关羽的name字段值被em标签包裹;

相关推荐
曹牧5 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
爬山算法6 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7256 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎6 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄6 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
忆~遂愿6 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds6 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
仟濹6 小时前
【Java基础】多态 | 打卡day2
java·开发语言
Re.不晚6 小时前
JAVA进阶之路——无奖问答挑战2
java·开发语言
Ro Jace7 小时前
计算机专业基础教材
java·开发语言