实用篇-ES-RestClient查询文档

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

一、快速入门

上面的查询文档都是依赖kibana,在浏览器页面使用DSL语句去查询es,如何用java去查询es里面的文档(数据)呢
我们通过match_all查询来演示基本的API,注意下面演示的是 'match_all查询,也叫基础查询'
首先保证你已经做好了 '实用篇-ES-环境搭建' ,创建了名为gghotel的索引库,然后开始下面的操作。如果需要浏览器操作es,那就不需要启动kibana容器

实用篇-ES-RestClient查询文档,分布式微服务,elasticsearch,大数据,搜索引擎

在进行下面的操作之前,确保你已经看了前面 '实用篇-ES-RestClient操作文档' 学的 '1. RestClient案例准备',然后在进行下面的操作


第一步: 在src/test/java/cn.itcast.hotel目录新建HotelSearchTest类,写入如下

package cn.itcast.hotel;

import cn.itcast.hotel.service.IHotelService;
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.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;

@SpringBootTest
public class HotelIndexTest2 {

     private RestHighLevelClient client;

     @Autowired
     private IHotelService hotelService;

     @Test
     void init(){
          System.out.println(client);
     }

     @BeforeEach
     void setUp(){
          this.client = new RestHighLevelClient(RestClient.builder(
                  //指定你Centos7部署的es的主机地址
                  HttpHost.create("http://192.168.229.129:9200")
          ));
     }

     @AfterEach
     void tearDown() throws IOException {
          this.client.close();
     }


     @Test
     void testMatchAll() throws IOException {
          //准备Request
          SearchRequest request = new SearchRequest("hotel");
          //组织DSL参数
          request.source().query(QueryBuilders.matchAllQuery());
          //发送请求,得到响应结果
          SearchResponse response = client.search(request, RequestOptions.DEFAULT);
          System.out.println(response);
     }

}

实用篇-ES-RestClient查询文档,分布式微服务,elasticsearch,大数据,搜索引擎

第二步: 把控制台里面我们需要的数据解析出来。返回的数据很多,我们主要是解析hits里面的数据就行了

实用篇-ES-RestClient查询文档,分布式微服务,elasticsearch,大数据,搜索引擎

把HotelSearchTest类修改为如下,主要的修改是sout之前做了一次解析,拿到我们想要的数据

package cn.itcast.hotel;

import cn.itcast.hotel.pojo.HotelDoc;
import cn.itcast.hotel.service.IHotelService;
import com.alibaba.fastjson.JSON;
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.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;

@SpringBootTest
public class HotelIndexTest2 {

     private RestHighLevelClient client;

     @Autowired
     private IHotelService hotelService;

     @Test
     void init(){
          System.out.println(client);
     }

     @BeforeEach
     void setUp(){
          this.client = new RestHighLevelClient(RestClient.builder(
                  //指定你Centos7部署的es的主机地址
                  HttpHost.create("http://192.168.229.129:9200")
          ));
     }

     @AfterEach
     void tearDown() throws IOException {
          this.client.close();
     }


     @Test
     void testMatchAll() throws IOException {
          //准备Request
          SearchRequest request = new SearchRequest("hotel");
          //组织DSL参数
          request.source().query(QueryBuilders.matchAllQuery());
          //发送请求,得到响应结果
          SearchResponse response = client.search(request, RequestOptions.DEFAULT);
          //下面为逐层解析json数据
          SearchHits searchHits = response.getHits();
          long total = searchHits.getTotalHits().value;
          System.out.println("共有" + total + "条数据");
          SearchHit[] hits = searchHits.getHits();
          for (SearchHit hit : hits) {
               String json = hit.getSourceAsString();
               //反系列化
               HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
               System.out.println("hotelDoc = " + hotelDoc);
          }


     }

}

实用篇-ES-RestClient查询文档,分布式微服务,elasticsearch,大数据,搜索引擎

二、match的三种查询

实用篇-ES-RestClient查询文档,分布式微服务,elasticsearch,大数据,搜索引擎

我们刚刚在第一节演示的是 match_all(也叫基本查询) 查询,下面将演示 match(也叫单字段查询) 和 multi_match(也叫多字段查询) 查询

【match 查询,也叫单字段查询】

在HotelSearchTest类添加如下

 @Test
     void testMatch() throws IOException {
          //准备Request
          SearchRequest request = new SearchRequest("hotel");
          //组织DSL参数
          request.source().query(QueryBuilders.matchQuery("name","如家"));
          //发送请求,得到响应结果
          SearchResponse response = client.search(request, RequestOptions.DEFAULT);
          //下面为逐层解析json数据
          SearchHits searchHits = response.getHits();
          long total = searchHits.getTotalHits().value;
          System.out.println("共有" + total + "条数据");
          SearchHit[] hits = searchHits.getHits();
          for (SearchHit hit : hits) {
               String json = hit.getSourceAsString();
               //反系列化
               HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
               System.out.println("hotelDoc = " + hotelDoc);
          }
     }

实用篇-ES-RestClient查询文档,分布式微服务,elasticsearch,大数据,搜索引擎

【multi_match 查询,也叫多字段查询】

在HotelSearchTest类添加如下

  @Test
     void testMatch() throws IOException {
          //准备Request
          SearchRequest request = new SearchRequest("hotel");
          //组织DSL参数
          request.source().query(QueryBuilders.multiMatchQuery("如家","name","business"));
          //发送请求,得到响应结果
          SearchResponse response = client.search(request, RequestOptions.DEFAULT);
          //下面为逐层解析json数据
          SearchHits searchHits = response.getHits();
          long total = searchHits.getTotalHits().value;
          System.out.println("共有" + total + "条数据");
          SearchHit[] hits = searchHits.getHits();
          for (SearchHit hit : hits) {
               String json = hit.getSourceAsString();
               //反系列化
               HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
               System.out.println("hotelDoc = " + hotelDoc);
          }
     }

实用篇-ES-RestClient查询文档,分布式微服务,elasticsearch,大数据,搜索引擎

总结: 要构建查询条件,只要记住一个QueryBuilders类即可

三、解析代码的抽取

我们发现对于 match、multi_match、match_all 查询,的解析部分的代码都是相同的,所以我们可以对解析部分的代码进行抽取,如下

快捷键ctrl + alt + M

  private void handleResponse(SearchResponse response) {
          //下面为逐层解析json数据
          SearchHits searchHits = response.getHits();
          long total = searchHits.getTotalHits().value;
          System.out.println("共有" + total + "条数据");
          SearchHit[] hits = searchHits.getHits();
          for (SearchHit hit : hits) {
               String json = hit.getSourceAsString();
               //反系列化
               HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
               System.out.println("hotelDoc = " + hotelDoc);
          }
     }

之后我们在test中只专注于json的获取,解析的任务交给这段代码 

四、bool和term、rang精确查询

原理同上

实用篇-ES-RestClient查询文档,分布式微服务,elasticsearch,大数据,搜索引擎

我们直接演示bool复合查询 

实用篇-ES-RestClient查询文档,分布式微服务,elasticsearch,大数据,搜索引擎 

 @Test
     void testBool() throws IOException {
          //准备Request
          SearchRequest request = new SearchRequest("hotel");
          //组织DSL参数
          BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
          boolQuery.must(QueryBuilders.termQuery("city","杭州"));
          boolQuery.filter(QueryBuilders.rangeQuery("price").lte(250));
          
          request.source().query(boolQuery);
          //发送请求,得到响应结果
          SearchResponse response = client.search(request, RequestOptions.DEFAULT);
          handleResponse(response);
     }

五、排序和分页

实用篇-ES-RestClient查询文档,分布式微服务,elasticsearch,大数据,搜索引擎

 @Test
     void testPageAndSort() throws IOException {
          int pageNum = 1;
          int pageSize = 5;
          //准备Request
          SearchRequest request = new SearchRequest("hotel");
          //组织DSL参数
          //查询所有
          request.source().query(QueryBuilders.matchAllQuery());
          //排序
          request.source().sort("price", SortOrder.ASC);
          //分页
          request.source().from(pageNum - 1).size(pageSize);

          //发送请求,得到响应结果
          SearchResponse response = client.search(request, RequestOptions.DEFAULT);
          handleResponse(response);
     }

六、高亮显示

 高亮API包括请求DSL构建和结果解析两部分,API和对应的DSL语句如下图,下图只是构建,再下面还有解析,高亮必须由构建+解析才能实现实用篇-ES-RestClient查询文档,分布式微服务,elasticsearch,大数据,搜索引擎

解析,如下图 

实用篇-ES-RestClient查询文档,分布式微服务,elasticsearch,大数据,搜索引擎

  @Test
     void testHighLight() throws IOException {
          //准备Request
          SearchRequest request = new SearchRequest("hotel");
          //组织DSL参数
          //查询所有
          request.source().query(QueryBuilders.matchQuery("name","如家"));
          //设置高亮匹配方式
          request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
          //发送请求,得到响应结果
          SearchResponse response = client.search(request, RequestOptions.DEFAULT);
          //下面为逐层解析json数据
          SearchHits searchHits = response.getHits();
          long total = searchHits.getTotalHits().value;
          System.out.println("共有" + total + "条数据");
          SearchHit[] hits = searchHits.getHits();
          for (SearchHit hit : hits) {
               String json = hit.getSourceAsString();
               //反系列化
               HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
              //解析,获取高亮结果
               Map<String, HighlightField> highlightFields = hit.getHighlightFields();
               if(!CollectionUtils.isEmpty(highlightFields)){
                    //根据字段名获取高亮结果
                    HighlightField highlightField = highlightFields.get("name");
                    //判断高亮字段不为空
                    if(highlightField!=null){
                         //获取高亮值
                         String name = highlightField.getFragments()[0].string();
                         //覆盖非高亮结果
                         hotelDoc.setName(name);
                    }
               }
               //最终输出
               System.out.println("hotelDoc = " + hotelDoc);
          }

     }

实用篇-ES-RestClient查询文档,分布式微服务,elasticsearch,大数据,搜索引擎文章来源地址https://www.toymoban.com/news/detail-756379.html

到了这里,关于实用篇-ES-RestClient查询文档的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • SpringCloud:ElasticSearch之RestClient查询文档

    文档的查询同样适用 RestHighLevelClient 对象,基本步骤包括: 1)准备 Request 对象 2)准备请求参数 3)发起请求 4)解析响应 我们以 match_all 查询为例 1.1.发起查询请求 代码解读: 第一步,创建 SearchRequest 对象,指定索引库名 第二步,利用 request.source() 构建DSL,DSL中可以包含查

    2024年02月03日
    浏览(33)
  • RestClient操作文档和DSL查询语法

    注:一般不用上方地理查询,用下面方法! 算法了解 4.1、Function Score Query(修改相关性算分) 4.2、Boolean Query

    2024年02月16日
    浏览(34)
  • Elasticsearch --- DSL、RestClient查询文档、搜索结果处理

    elasticsearch的查询依然是基于JSON风格的DSL来实现的。   Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有 :查询出所有数据,一般测试用。例如:match_all 全文检索(full text)查询 :利用分词器对用户输入内容分词,然后去倒排

    2024年02月05日
    浏览(49)
  • SpringCloud(十)——ElasticSearch简单了解(二)DSL查询语句及RestClient查询文档

    查询所有 :查询出所有数据,一般测试用。例如: match_all 全文检索查询 :利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如: match_query multi_match_query 精确查询 :根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。例如: ids range

    2024年02月10日
    浏览(51)
  • ElasticSearch基础1——索引和文档。Kibana,RestClient操作索引和文档+黑马旅游ES库导入

    导航: 【黑马Java笔记+踩坑汇总】JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud/SpringCloudAlibaba+黑马旅游+谷粒商城 黑马旅游源码:  https://wwmg.lanzouk.com/ikjTE135ybje 目录 1.初识弹性搜索elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 1.1.2.ELK弹性栈 1.1.3.elasticsearch和lucene 1.1.4.搜索引擎技术

    2024年02月01日
    浏览(42)
  • 微服务分布式搜索引擎 Elastic Search RestClient 操作文档

    本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 初始化RestHighLevelClient 为了与索引库操作分离,我们再次参加一个测试类,做两件事情: 初始化RestHighLevelClient 我们的酒店数据

    2024年01月24日
    浏览(31)
  • 【ElasticSearch】使用 Java 客户端 RestClient 实现对文档的查询操作,以及对搜索结果的排序、分页、高亮处理

    在 Elasticsearch 中,通过 RestAPI 进行 DSL 查询语句的构建通常是通过 HighLevelRestClient 中的 resource() 方法来实现的。该方法包含了查询、排序、分页、高亮等所有功能,为构建复杂的查询提供了便捷的接口。 RestAPI 中构建查询条件的核心部分是由一个名为 QueryBuilders 的工具类提供

    2024年01月16日
    浏览(51)
  • 17、全文检索 -- Elasticsearch -- 使用 反应式 RestClient (ReactiveElasticsearchClient)操作 Es 服务器(增、删、查 :索引库和文档)

    Elasticsearch 所提供 RestHighLevelClient 本身提供了 【同步编程】 和 【异步编程】两种模型。 Elasticsearch 官方并未提供反应式的 RestClient : 因此 Spring Data Elasticsearch 额外补充了一个 ReactiveElasticsearchClient,用于提供反应式API支持, ReactiveElasticsearchClient 相当于 RestHighLevelClient 的反应式

    2024年04月28日
    浏览(36)
  • ES 文档查询 之 DSL

    ES支持一种JSON格式的查询,叫做DSL, domain specific language   DSL 官方文档地址:Query DSL | Elasticsearch Guide [7.17] | Elastic 练习   match查询   multi-match查询   term查询  精确查询不会对我们查询内容进行分词,完全匹配才回命中。 range查询   gt : greater than 大于      gte : greater than e

    2023年04月19日
    浏览(28)
  • es使用java来查询文档(基于es7.8)

    注意,索引的字段mapping是如下类型,如果index是FALSE的话,会导致条件查询失败: 先引入pom依赖: 创建User类: 然后在名为user的索引里,插入多条数据,在main方法里进行测试: 然后进行测试:

    2024年02月11日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包