【SpringCloud——Elasticsearch(中)】

news2024/11/24 17:54:47

一、DSL查询语法以及整合JAVA代码使用

以下操作案例均基于上篇的hotel索引库及其数据进行。

 1、查询基本语法

GET /indexName/_search
{
  "query": {
    "查询类型":{
      "查询条件":"条件值"
    }
  }
}

2、查询所有

2.1、DSL语句

#查询所有
GET /hotel/_search
{
  "query": {
    "match_all": {
    }
  }
}

2.2、JAVA

    //match_all查询所有
    @Test
    void testMatchAll() throws IOException {
        //1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        request.source().query(QueryBuilders.matchAllQuery());
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        showResult(response);
    }

注:showResult方法是将返回的响应进行解析,代码如下:

    private void showResult(SearchResponse response){
        //4.解析结果
        SearchHits searchHits = response.getHits();
        //4.1、查询结果总条数
        long value = searchHits.getTotalHits().value;
        System.out.println("共" + value + "条");
        //4.2、查询到的结果数据
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            String json = hit.getSourceAsString();
            HotelDoc doc = JSON.parseObject(json,HotelDoc.class);
            System.out.println(doc);
        }
    }

下文操作均使用此方法对响应进行解析。

 3、全文检索查询

全文检索查询会对用户输入的内容进行分词,常用于搜索框搜索。

3.1、DSL语句

#match查询
GET /hotel/_search
{
  "query": {
    "match": {
      "all": "外滩"
    }
  }
}
#multi_match查询
#与match查询类似,只不过允许同时查询多个字段
GET /hotel/_search
{
  "query": {
    "multi_match": {
      "query": "外滩如家",
      "fields": ["business","name","brand"]
    }
  }
}

3.2、JAVA

    //match查询
    @Test
    void testMatch() throws IOException {
        //1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        request.source().query(QueryBuilders.matchQuery("all","外滩"));
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        showResult(response);
    }
    //multi_match查询
    @Test
    void testMultiMatch() throws IOException {
        //1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        String[] fields = {"brand", "business", "name"};
        request.source().query(QueryBuilders.multiMatchQuery("外滩如家",fields));
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        showResult(response);
    }

4、精确查询

精确查询一般是查找keyword、数值、日期、boolean等类型字段。

  • term:根据词条精确值查询
  • range:根据值的范围查询

 4.1、DSL语句

#精确查询(term精确值)
GET /hotel/_search
{
  "query": {
    "term": {
      "brand": {
        "value": "7天酒店"
      }
    }
  }
}
#精确查询(range范围)
GET /hotel/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 300,
        "lte": 400
      }
    }
  }
}

4.2、JAVA

    //精确查询
    @Test
    void testTerm() throws IOException {
        //1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        request.source().query(QueryBuilders.termQuery("brand","7天酒店"));
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        showResult(response);
    }
    //范围查询
    @Test
    void testRange() throws IOException {
        //1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        request.source().query(QueryBuilders.rangeQuery("price").gte(300).lte(400));
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        showResult(response);
    }

5、地理查询

  • geo_bounding_box:查询geo_point值落在某个矩形范围内的所有文档。(不常用)
  • geo_distance:查询到指定中心点小于某个距离值的所有文档。(以下操作均针对此查询)

5.1、DSL语句

#地理查询
GET /hotel/_search
{
  "query": {
    "geo_distance":{
      "distance":"3km",
      "location":"31.21,121.5"
    }
  }
}

5.2、JAVA

使用第三方工具获取当前地理位置,发送至后端,后端根据传递的地理位置对酒店距离进行排序后返回。(附近的酒店功能)

            //2.3、距离排序
            if (params.getLocation() != null && !params.getLocation().equals("")){
                request.source().sort(SortBuilders.
                        geoDistanceSort("location",new GeoPoint(params.getLocation()))
                        .order(SortOrder.ASC)
                        .unit(DistanceUnit.KILOMETERS));
            }

6、复合查询

6.1、function score:算分函数查询,可以控制文档相关性算分,控制文档排名。

①、DSL语句

#相关性算分(function score查询)
GET /hotel/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "all": "外滩"
        }
      },
      "functions": [
        {
          "filter": {
            "term": {
              "brand": "如家"
            }
          }
          , "weight": 10
        }
      ],
      "boost_mode": "multiply"
    }
  }
}

②、JAVA案例——对付了广告费的酒店进行排名靠前展示

            //2.算分控制
            FunctionScoreQueryBuilder functionScoreQuery =
                    QueryBuilders.functionScoreQuery(
                            //原始查询,相关性算分的查询
                            boolQuery,
                            //function score数组
                            new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
                                    //其中的一个function score元素
                                    new FunctionScoreQueryBuilder.FilterFunctionBuilder(
                                            //过滤条件
                                            QueryBuilders.termQuery("isAD",true),
                                            //算分函数
                                            ScoreFunctionBuilders.weightFactorFunction(10)
                                    )
                            });
            request.source().query(functionScoreQuery);

6.2、Boolean Query(复合查询)

①、DSL语句

搜索名字包含“如家”,价格不高于400,在坐标31.21,121.5周围10km范围内的酒店:

#复合查询(Boolean Query)
GET /hotel/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "如家"
          }
        }
      ],
      "must_not": [
        {
          "range": {
            "price": {
              "gt": 400
            }
          }
        }
      ],
      "filter": [
        {
          "geo_distance": {
            "distance": "10km",
            "location": {
              "lat": 31.21,
              "lon": 121.5
            }
          }
        }
      ]
    }
  }
}

②、JAVA

    //复合查询
    @Test
    void testBoolean() throws IOException {
        //1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        boolQuery.must(QueryBuilders.matchQuery("name","如家"));
        boolQuery.mustNot(QueryBuilders.rangeQuery("price").gt(400));
        boolQuery.filter(QueryBuilders.geoDistanceQuery("location").distance("10km"));
        request.source().query(boolQuery);
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        showResult(response);
    }

二、搜索结果处理以及整合JAVA代码使用

1、排序

elasticsearch支持对搜索结果排序,默认是根据相关度算分(_score)来排序。可以排序字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等。

1.1、DSL语句

查询所有酒店并按照酒店评分降序排列,评分一致时按照酒店价格升序排列。

#排序
GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "score":  "desc"
    },
    {
      "price": "asc"
    }
  ]
}

 地理坐标排序:

#找到108.94647 , 34.34727 周围的酒店,并升序排序
GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "_geo_distance": {
        "location": {
          "lat": 34.34727,
          "lon": 108.94647
        },
        "order": "asc",
        "unit": "km"
      }
    }
  ]
}

1.2、JAVA

    //排序
    @Test
    void testSort() throws IOException {
        //1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        request.source().query(QueryBuilders.matchAllQuery());
        request.source().sort("score", SortOrder.DESC);
        request.source().sort("price",SortOrder.ASC);
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        showResult(response);
    }

 地理坐标排序:

            //2.3、距离排序
            if (params.getLocation() != null && !params.getLocation().equals("")){
                request.source().sort(SortBuilders.
                        geoDistanceSort("location",new GeoPoint(params.getLocation()))
                        .order(SortOrder.ASC)
                        .unit(DistanceUnit.KILOMETERS));
            }

2、分页

2.1、DSL语句

#分页查询
GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "price":  "asc"
    }
  ],
  "from": 20,
  "size": 10
}

2.2、JAVA

    //分页
    @Test
    void testLimit() throws IOException {
        //1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        request.source().query(QueryBuilders.matchAllQuery());
        request.source().sort("price",SortOrder.ASC);
        request.source().from(20);
        request.source().size(10);
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        showResult(response);
    }

3、高亮

高亮就是在搜索结果中把搜索关键字突出显示。

3.1、DSL语句

#高亮查询处理
GET /hotel/_search
{
  "query": {
    "match": {
      "all": "如家"
    }
  }, 
  "highlight": {
    "fields": {
      "name": {
        "require_field_match": "false"
      }
    }
  }
}

3.2、JAVA

    //高亮
    @Test
    void testLight() throws IOException {
        //1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        request.source().query(QueryBuilders.matchQuery("all","如家"));
        request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //4.解析结果
        SearchHits searchHits = response.getHits();
        //4.1、查询结果总条数
        long value = searchHits.getTotalHits().value;
        System.out.println("共" + value + "条");
        //4.2、查询到的结果数据
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            String json = hit.getSourceAsString();
            HotelDoc doc = 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].toString();
                    //覆盖非高亮结果
                    doc.setName(name);
                }
            }
            System.out.println(doc);
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/605781.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java并发编程面试题——线程池

目录 1.什么是线程池&#xff1f;有什么优缺点&#xff1f;2.创建线程池的方式有哪些&#xff1f;2.1.通过 Executor 框架的工具类 Executors 来创建不同类型的线程池2.2.使用 ThreadPoolExecutor 类自定义线程池2.3.注意事项 3.自定义线程池时有哪些参数&#xff1f;它们各有说…

笔试强训 Day 7

选择题&#xff1a; 1.在&#xff08;&#xff09;情况下适宜采用 inline 定义内联函数 A 函数体含有循环语句 B 函数体含有递归语句C 函数代码少、频繁调用 D 函数代码多&#xff0c;不常调用 复习一下内联函数 在编译阶段&#xff0c;会将内联函数展开 —— 将函数调用替换成…

四、若依(前后端分离)项目构建docker 镜像

若依(前后端分离&#xff09;项目构建docker 镜像 1. 构建好ruoyi-admin.jar包&#xff0c;上传到服务器项目目录下 2. 创建conf目录将若依项目&#xff08;Spring boot &#xff09;配置文件修改好&#xff0c;上传存入conf目录 注意&#xff1a;这里的地址不能写127.0.0.1和…

ur5在gazebo中仿真的官方源码浅析

一 复现 好久之前初学rosgazebo机械臂仿真的时候总有些懵&#xff0c;用的是ur5机械臂&#xff0c;现在回过头来看好像看懂了一些&#xff0c;故重新理清了一下功能包的逻辑&#xff0c;方便查阅。 官方源码 本文参考 ubuntu16.04安装UR3/UR5/UR10机械臂的ROS驱动并实现gazebo…

chatgpt赋能python:Python列表从后往前遍历

Python列表从后往前遍历 作为一门广泛应用于数据科学、机器学习和Web开发的高级编程语言&#xff0c;Python为开发人员和科学家们提供了很多便利。在Python里面&#xff0c;列表是一种非常常见的数据结构&#xff0c;它允许开发人员存储和处理多个元素。但是&#xff0c;有时候…

5款提高工作效率的无广告软件

今天推荐一些可以大幅度提升办公效率的小软件&#xff0c;安全无毒&#xff0c;下载简单&#xff0c;最重要的是没有广告&#xff01; 1.照片处理——Darktable Darktable是一款用于处理和管理数码照片的工具。它可以让你对RAW格式的照片进行非破坏性的编辑,并提供多种模块和…

Nginx 启动成功无法访问网页

查看是否有Nginx进程 ps -ef | grep nginx 如下图有三个进程就是启动成功了 端口 因为Nginx我配置的是80端口&#xff0c;所以只要检查80端口是否开放即可 netstat -lnt | grep 80tcp: 这表示所显示的连接是基于TCP协议的。0.0.0.0:80: 这是本地监听的IP地址和端口号。在这…

Zabbix5通过脚本自定义Nginx监控

1、客户端配置 1.1、nginx开启nginx status 使用 zabbix 监控 nginx&#xff0c;首先 nginx 需要配置 ngx_status&#xff0c;nginx.conf加入以下配置&#xff0c;并重启Nginx或reload location /ngx_status { stub_status on; access_log off; #allow 127.0.0.1; #deny all…

C语言---初识结构体

1、结构体的声明 1.1、结构的基础知识 结构是一些值得集合&#xff0c;这些值称为成员变量。结构的每一个成员可以是不同类型的变量。 char、short、int、long、long、float、double是内置类型。 比如说&#xff0c;我们想要描述单一的成绩&#xff0c;身高我们直接用int类型就…

FPGA时序约束--基础理论篇

FPGA开发过程中&#xff0c;离不开时序约束&#xff0c;那么时序约束是什么&#xff1f;简单点说&#xff0c;FPGA芯片中的逻辑电路&#xff0c;从输入到输出所需要的时间&#xff0c;这个时间必须在设定的时钟周期内完成&#xff0c;更详细一点&#xff0c;即需要满足建立和保…

MokaPeople 上线 300 天:主打管理者视角和全员体验

当前&#xff0c;我们是身处的时代已从 VUCA 向 BANI 转变&#xff0c;在政策、经济和技术等多方面因素的驱动下&#xff0c;数字化转型已成为企业发展的必然趋势。 尤其在当下对于人才环境中的竞争态势也不得不迫使 HR 转型也进入了关键性的时刻。 6 月 2 日&#xff0c;国内…

TCP协议的相关特性

目录 TCP特点概要 TCP协议段格式 TCP原理 确认应答 超时重传 连接管理(三次握手,四次挥手) 三次握手 四次挥手 流水线传输 滑动窗口 滑动窗口ACK丢失 滑动窗口数据报丢失 流量控制 拥塞控制 延迟应答 停止等待协议 回退N帧协议 面向字节流 缓冲区 粘包问题 TCP异常 &…

手撕源码(三)ArrayList(JDK8)

目录 1.使用示例2.new ArrayList<>() 解析2.1 空列表2.2 默认大小的共享数组实例2.3 构造方法 3.new ArrayList<>(initialCapacity) 解析3.1 指定大小的共享数组实例3.2 构造方法 4.add() 解析4.1 容量大小4.2 add() 解析4.3 ensureCapacityInternal() 解析1&#…

【吴恩达GANs】【C1W4】Conditional Controllabel Generation

视频链接&#xff1a;吴恩达DeepLearning.ai之生成对抗网络&#xff08;GANS&#xff09;专业化〔Andrew Ng〕 4-2 Conditional generation intuition Unconditional Generation&#xff1a;从随机类中得到输出&#xff0c;每次输出的类也都是随机的&#xff0c;无法得到指定…

Redis和Mysql数据同步方案---延迟双删

一般场景下数据库和redis的同步机制&#xff1a; 针对有请求来读取数据库的场景&#xff1a; 但是如果有想要修改数据库内容的场景该怎么保持同步呢&#xff1f; 在我们访问redis时&#xff0c;redis中的数据可能不是热点数据&#xff0c;即此时数据库的更新操作已经完成&…

chatgpt赋能python:Python几行代码:打造高效SEO工具

Python几行代码&#xff1a;打造高效SEO工具 Python作为一种易用、可靠的编程语言&#xff0c;在数据处理、网页爬取等方面都有广泛应用。而对于SEO工作者来说&#xff0c;利用Python写几行简单的代码&#xff0c;可以帮助我们更高效地分析网站数据、监控关键词排名、抓取竞争…

测试工程师:“ 这锅我不背 ” ,如何回怼开发....?

前言 在一个周末的早餐我被同事小周叫出去跑步&#xff0c;本想睡个懒觉&#xff0c;但是看他情绪不太稳定的样子&#xff0c;无奈艰难爬起陪他去跑步。 只见她气冲冲的对着河边大喊&#xff1a;真是冤枉啊&#xff01;!&#xff01; 原来是在工作中被莫名其妙背锅&#xff0…

计算机存储体系

目录 一、基本概念 二、主存储器的基本组成 三、SRAM和DRAM 四、只读存储器ROM 五、主存储器与CPU的连接 六、双端口RAM和多模块存储器 七、磁盘存储器 八、固态硬盘SSD 九、Cache高速缓冲存储器 十、虚拟存储系统 一、基本概念 存储器的层次结构 主存——辅存&…

1_5 光流法计算VO(optical_flow)

采用特征点法做VO存在耗时较大的问题&#xff0c;一般耗时情况&#xff1a;如下 (1) 在图像中提取特征点并计算特征描述&#xff0c; 非常耗时 ~10ms ORB&#xff0c;shift耗时更多&#xff1b; (2) 在不同图像中寻找特征匹配&#xff0c; 非常耗时 …

centos上搭建以太坊私有链

第一步 安装go语言环境 root用户下新建一个soft目录(相关目录可以随意) 去golang官网找到链接&#xff0c;在soft目录下下载golang压缩包 wget --no-check-certificate https://go.dev/dl/go1.20.4.linux-amd64.tar.gz其中如果出现Unable to establish SSL connection.&am…