【ElasticSearch】JavaRestClient实现文档查询、排序、分页、高亮

这篇具有很好参考价值的文章主要介绍了【ElasticSearch】JavaRestClient实现文档查询、排序、分页、高亮。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、入门案例

先初始化JavaRestClient对象:

@SpringBootTest
public class HotelSearchTest {

    private RestHighLevelClient client;

    @Test
    void testInit() {

        System.out.println(client);
    }

    @BeforeEach
    void setUp() {
        this.client = new RestHighLevelClient(RestClient.builder(
                HttpHost.create("http://10.4.130.220:9200")
        ));
    }

    @AfterEach
    void tearDown() throws IOException {
        this.client.close();
    }
}
用match_all来演示基本的API使用:

代码和DSL对应上就是:

resthighlevelclient 高亮,ElasticSearch,elasticsearch,python,大数据

运行结果:

resthighlevelclient 高亮,ElasticSearch,elasticsearch,python,大数据

然后是对结果的解析,对照响应结果:

resthighlevelclient 高亮,ElasticSearch,elasticsearch,python,大数据

示例代码:

@Test
void testMatchAll() throws IOException {
    SearchRequest request = new SearchRequest("hotel");
    request.source()
            .query(QueryBuilders.matchAllQuery());
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    SearchHits searchHits = response.getHits();
    long total = searchHits.getTotalHits().value;
    SearchHit[] hits = searchHits.getHits();
    for (SearchHit hit : hits) {
        String json = hit.getSourceAsString();
        HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
        System.out.println(hotelDoc);
    }
}

运行结果:

resthighlevelclient 高亮,ElasticSearch,elasticsearch,python,大数据


总结:

  • 构建DSL是通过HighLevelRestClient中的resource()方法来实现的,这里包含了查询、排序、分页、高亮等操作
    resthighlevelclient 高亮,ElasticSearch,elasticsearch,python,大数据

  • 构建查询条件的核心部分,即查询类型,是用一个名为QueryBuilders的工具类实现的,它包含了各种查询方法
    resthighlevelclient 高亮,ElasticSearch,elasticsearch,python,大数据

  • 查询的基本步骤总结:
    resthighlevelclient 高亮,ElasticSearch,elasticsearch,python,大数据

2、全文检索

和match_all一样,不同的是在QueryBuildes工具类中选的方法不同:

// 单字段查询
QueryBuilders.matchQuery("all", "如家");
// 多字段查询
QueryBuilders.multiMatchQuery("如家", "name", "business");

对比下DSL语句:
resthighlevelclient 高亮,ElasticSearch,elasticsearch,python,大数据

@Test
void testMatch() throws IOException {
    SearchRequest request = new SearchRequest("hotel");
    request.source()
            .query(QueryBuilders.matchQuery("all", "如家"));
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    handleResponse(response);//对响应的处理代码相同,做抽取
}

private void handleResponse(SearchResponse response) {
    SearchHits searchHits = response.getHits();
    long total = searchHits.getTotalHits().value;
    SearchHit[] hits = searchHits.getHits();
    for (SearchHit hit : hits) {
        String json = hit.getSourceAsString();
        HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
        System.out.println(hotelDoc);
    }
}

对响应的处理代码相同,这里做个抽取,Ctrl + Alt +M(没用的话Ctrl + Alt + Shift + T,再选Extract Method), 再不行就Settings -> Keymap来打开快捷键设置对话框

resthighlevelclient 高亮,ElasticSearch,elasticsearch,python,大数据

运行:

resthighlevelclient 高亮,ElasticSearch,elasticsearch,python,大数据

3、精确查询

精确查询常见的有term查询和range查询,同样利用QueryBuilders实现

// 词条查询
QueryBuilders.termQuery("city", "杭州"); 
// 范围查询
QueryBuilders.rangeQuery("price").gte(100).lte(150);

与DSL对比:

resthighlevelclient 高亮,ElasticSearch,elasticsearch,python,大数据

@Test
void testRangeQuery() throws IOException {
    SearchRequest request = new SearchRequest("hotel");
    request.source()
            .query(QueryBuilders.rangeQuery("price").gte(100).lte(300));
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    handleResponse(response);
}

运行:

resthighlevelclient 高亮,ElasticSearch,elasticsearch,python,大数据

4、复合查询-boolean query

// 创建布尔查询
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 添加must条件
boolQuery.must(QueryBuilders.termQuery("city", "杭州")); 
// 添加filter条件
boolQuery.filter(QueryBuilders.rangeQuery("price").lte(250));

和DSL的对比:

resthighlevelclient 高亮,ElasticSearch,elasticsearch,python,大数据

@Test
void testBooleanQuery() throws IOException {
    //准备Request
    SearchRequest request = new SearchRequest("hotel");
    //准备DSL
    //2.1 准备BooleanQuery
    BoolQueryBuilder booleanQuery = QueryBuilders.boolQuery();
    //2.2 添加term,用must
    booleanQuery.must(QueryBuilders.termQuery("city", "上海"));
    //2.3 添加range,用filter
    booleanQuery.filter(QueryBuilders.rangeQuery("price").gt(100));  //大于300,lt是小于,less than
    //2.4 测试下mustNot
    booleanQuery.mustNot(QueryBuilders.rangeQuery("price").gte(500)); //大于等于500取反,小于500
    //2.5 玩玩should,或
    booleanQuery.should(QueryBuilders.termQuery("name", "北京宝辰饭店"));
    request.source().query(booleanQuery);
    //3.发送请求
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    //4.调用上面抽取的方法解析响应
    handleResponse(response);
}

运行:

resthighlevelclient 高亮,ElasticSearch,elasticsearch,python,大数据

5、排序和分页

// 查询
request.source().query(QueryBuilders.matchAllQuery());
// 分页
request.source().from(0).size(5);
// 价格排序
request.source().sort("price", SortOrder.ASC);

和DSL的对应关系:

resthighlevelclient 高亮,ElasticSearch,elasticsearch,python,大数据

//pageNum和pageSize从前端Dto获取,
//则起点为(pageNum-1)*pageSize

request.source().from((pageNum - 1)*pageSize).size(pageSize);
@Test
void testPage() throws IOException {
    int pageNum = 2;
    int pageSize = 3;
    SearchRequest request = new SearchRequest("hotel");
    request.source()
            .query(QueryBuilders.matchQuery("name", "如家"));
    request.source().from((pageNum - 1) * pageSize).size(pageSize);
    request.source().sort("price", SortOrder.ASC);
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    handleResponse(response);
}

运行:

resthighlevelclient 高亮,ElasticSearch,elasticsearch,python,大数据

6、高亮

高亮API包括请求DSL构建和结果解析两部分,DSL构建为:

request.source().highlighter(new HighlightBuilder()        
		.field("name")        
		// 是否需要与查询字段匹配
       .requireFieldMatch(false)
);

resthighlevelclient 高亮,ElasticSearch,elasticsearch,python,大数据
不用默认标签的话也可以,继续链式编程,后面调postTags()等方法即可。

@Test
void testHighLighter() throws IOException {
    SearchRequest request = new SearchRequest("hotel");
    request.source()
            .query(QueryBuilders.matchQuery("all","如家"))
            .highlighter(new HighlightBuilder().field("name")
                    .requireFieldMatch(false)
                    .preTags("<strong>")
                    .postTags("</strong")
            );
    SearchResponse response = client.search(request,RequestOptions.DEFAULT);
	handleResponse(response);
}

发现结果并未高亮,因为上面抽取的handleResponse方法是对_source下处理的,这里的数据是原数据,本就不会被修改,因此要继续拿highlight下的数据,即解析高亮结果

resthighlevelclient 高亮,ElasticSearch,elasticsearch,python,大数据

@Test
void testHighLighter() throws IOException {
    SearchRequest request = new SearchRequest("hotel");
    request.source()
            .query(QueryBuilders.matchQuery("all","如家"))
            .highlighter(new HighlightBuilder().field("name")
                    .requireFieldMatch(false)
                    .preTags("<strong>")
                    .postTags("</strong")
            );
    SearchResponse response = client.search(request,RequestOptions.DEFAULT);
    SearchHits searchHits = response.getHits();
    SearchHit[] hits = searchHits.getHits();
    for(SearchHit hit : hits){
        String hotelDocString = hit.getSourceAsString();
        HotelDoc hotelDoc = JSON.parseObject(hotelDocString,HotelDoc.class);
        Map<String, HighlightField> highlightFieldMap = hit.getHighlightFields();
        if(! CollectionUtils.isEmpty(highlightFieldMap)){
            HighlightField highlightField = highlightFieldMap.get("name");
            if(highlightField != null){
                String name = highlightField.getFragments()[0].string();
                hotelDoc.setName(name);
                System.out.println(hotelDoc);
            }
        }
    }
}

运行:

resthighlevelclient 高亮,ElasticSearch,elasticsearch,python,大数据文章来源地址https://www.toymoban.com/news/detail-633239.html

到了这里,关于【ElasticSearch】JavaRestClient实现文档查询、排序、分页、高亮的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot 集成 ElasticSearch:实现模糊查询、批量 CRUD、排序、分页和高亮功能

    文章来源:https://blog.csdn.net/qq_52355487/article/details/123805713 在pom.xml里加入如下依赖 非常重要:检查依赖版本是否与你当前所用的版本是否一致,如果不一致,会连接失败! 1.创建、判断存在、删除索引 2.对文档的CRUD 创建文档: 注意:如果添加时不指定文档ID,他就会随机生成

    2024年02月04日
    浏览(28)
  • ElasticSearch学习简单使用(索引、文档、分页查询、多条件查询)

    APIfox接口在线文档 安装连接 下载链接(各个系统,也包括docker) 打开 我下载的时window版本,直接就是zip压缩包解压后直接使用 执行bin目录下的这个bat文件,就会自动打开终端运行了。 大部分使用http请求进行学习。 你需要一个接口工具,postman,APIfox,或者一些浏览器插件

    2024年02月03日
    浏览(31)
  • ElasticSearch核心详解、文档、查询响应、分页、映射、结构化查询

    在Elasticsearch中,文档以JSON格式进行存储,可以是复杂的结构,如: 其中,card是一个复杂对象,嵌套的Card对象 元数据(metadata)        一个文档不只有数据。它还包含了元数据(metadata)——关于文档的信息。 三个必须的元数据节点是: index        索引(index)类似于关

    2024年02月12日
    浏览(24)
  • Elasticsearch - 聚合获取原始数据并分页&排序&模糊查询

    ES版本: 7.6. 需要按照主机ID 进行告警时间的汇总,并且还得把主机相关的信息展示出来。 注: 所有的数据都存在索引中, 通过一个DSL查询展示 实际上就是将terms聚合的结果以列表形式分页展示。 bucket_sort中 from不是pageNum,如想实现pageNum效果,from=pageNum*size即可; terms聚合

    2024年02月05日
    浏览(34)
  • ElasticSearch DSL语句(bool查询、算分控制、地理查询、排序、分页、高亮等)

    查询所有:查询所有数据,一般在测试时使用。march_all,但是一般显示全部,有一个分页的功能 全文检索(full text)查询:利用分词器对用户的输入内容进行分词,然后去倒排索引库匹配。例如: match_query mutil_match_query 精确查询:根据精确词条值查询数据,一般查找的时k

    2024年02月12日
    浏览(39)
  • ElasticSearch - DSL查询文档语法,以及深度分页问题、解决方案

    目录 一、DSL 查询文档语法 前言 1.1、DSL Query 基本语法 1.2、全文检索查询 1.2.1、match 查询 1.2.2、multi_match 1.3、精确查询 1.3.1、term 查询 1.3.2、range 查询 1.4、地理查询 1.4.1、geo_bounding_box 1.4.2、geo_distance 1.5、复合查询 1.5.1、相关性算分 1.5.2、function_score 1.5.3、boolean query 1.6、搜索

    2024年02月07日
    浏览(35)
  • Elasticsearch:RestHighLevelClient实现搜索、分页、排序、高亮

    1.引入依赖 2.自定义搜索DTO 3.封装工具类、实现 分页、高亮、排序 反射工具类 ReflectUtil 是我自定义的,原理是反射,可以引入hutool的工具包,同样也可以实现该结果

    2024年02月11日
    浏览(32)
  • 十二、MySQL(DQL)分组/排序/分页查询如何实现?

    (1)基础语法: (2)注意事项: (3)理解:          select后的“字段列表”是由from后的参数决定的,where的执行时间在分组操作之前,having的执行时间在分组操作之后。 执行时间:where分组操作having 新的数据类型 (1)根据性别分组,并统计男女员工的数量 (2)根

    2024年02月10日
    浏览(35)
  • SpringBoot整合ElasticSearch实现分页查询

    本文使用SpringBoot整合ElasticSearch实现分页查询 还是继续使用spring-boot-starter-data-elasticsearch来实现分页查询操作 数据准备 使用ElasticsearchRestTemplate来实现 程序结果 使用ElasticsearchOperations来实现 程序结果 本文记录了SpringBoot整合ElasticSearch来实现分页查询的两种方式

    2024年01月25日
    浏览(34)
  • ES(Elasticsearch)+SpringBoot实现分页查询

    1.ES介绍   ES作为一个搜索工具,寄托于Lucene之上,提供了方便的数据存储和搜索服务,一般的用它来作为网页数据索引以及存储用户画像(即用户标签)数据,可以提供复具有复杂的查询条件的服务。例如在网页索引中,通过倒排的方式索引的方式,对文档进行分词存储,

    2024年02月16日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包