Elasticsearch常用查询语法及RestClient操作

news2024/9/20 2:58:12

DSL Query基本语法

1,查询所有数据matchall(当然并不是会显示所有数据)

#查询所有数据
GET /索引名/_search
{
  "query": {
    "查询类型": {
      "查询条件":"条件值"
    }
  }
}

 2,全文搜索检索-分词搜索

match查询:全文检索查询的一种,会对用户内容分词,然后去倒排索引库检索,语法。

#根据条件查询 match

GET /索引名/_search
{
  "query": {
    "查询类型": {
      "查询那个字段": "查询的具体值"
    }
  }
}
# 示例
GET /hotel/_search
{
  "query": {
    "match": {
      "all": "北京"
    }
  }
}

multi_match:和match类似,但是它允许多个字段进行查询

# 根据多个字段来搜 multi_match
GET /索引名/_search
{
  "query": {
    "查询类型": {
      "query": "需要查询字段的具体值",
      "fields": ["查询字段1","查询字段2"]
    }
  }
}

# 根据多个字段来搜 multi_match
GET /hotel/_search
{
  "query": {
    "multi_match": {
      "query": "北京",
      "fields": ["city","name"]
    }
  }
}

解释:在hotel索引库中按照addressname两个字段搜索值包含北京的文档

3,精准查询

精准查询一般是查找keyword,数值,日期,boolean等不可分割的字段。

term:根据词条精准查询

range:根据值的范围查询

term查询

#精准查询-term
GET /索引名/_search
{
  "query": {
    "查询类型": {
      "查询字段": {
        "value": "查询的具体值"
      }
    }
  }
}

#精准查询-term
GET /hotel/_search
{
  "query": {
    "term": {
      "city": {
        "value": "上海"
      }
    }
  }
}

解释:在hotel索引库中查找city的值等于上海的所有文档,(city值一定是上海

range查询-范围查询


#精准查询-范围查询range
GET /索引名/_search
{
  "query": {
    "查询类型": {
      "查询字段": {
        "gte": 最小值,
        "lte": 最大值
      }
    }
  }
}

GET /hotel/_search
{
  "query": {
    "range": {
      "score": {
        "gte": 10,
        "lte": 45
      }
    }
  }
}

解释:在hotel索引库中查询score的值大于等于10小于等于45的文档。

4,复合查询

复合查询:复合查询可以将其他简单查询组合起来,实现更复杂的逻辑,例如:

funcation_score:算分函数查询,可以根据某些规则(打分算法)计算文档得分

1,funcation score Query

例如:

#修改得分
GET /hotel/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "all": "北京"
        }
      },
      "functions": [
        {
          "filter": {
            "term": {
              "brand": "如家"
            }
          },
          "weight": 10
        }
      ],
      "boost_mode": "multiply"
    }
  }
  
}

解释:查询索引库为hotel索引库,查询字段为all,值为北京,过滤brand为如家的文档,得分方式为默认,乘10.

2,Boolean Query

布尔查询是一个或者多个子句的组合子查询的组合方式有
must:必须匹配每个子查询,类似“与
should:选择性匹配子查询,类似“或
must_not:必须不匹配,不参与算分,类似“非
filter:必须匹配,不参与算分

例如,查询名字包含如家,价格不高于400的酒店

# 使用bool查询功能
GET /hotel/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "如家"
          }
        }
      ],
      "must_not": [
        {
          "range": {
            "range": {
              "gt": 400
            }
          }
        }
      ]
    }
  }
}

使用RestClient进行query查询

建议在上一篇博客基础上进行

RestClient操作Elasticsearch(Java)-CSDN博客文章浏览阅读838次,点赞30次,收藏12次。Es官方提供了各种不用语言的客户端,用来操作Es,这些客户端的本质就是组装DSL语句,通过http请求发送给Es,从而简化操作es基础篇不熟悉参考一下博客:ElasticSearch入门篇-CSDN博客Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。https://blog.csdn.net/qq_63837759/article/details/137755058?spm=1001.2014.3001.5501

全文检索查询-分词搜索

会在倒排索引库中做分词匹配,类似于模糊查询

因为最后的结果需要解析,于是为了后续代码的简洁,我们把解析的代码单独书写出来,这里用的是fastJson:


    /**
     *用来解析返回的数据,包含高亮处理(针对的是name字段)
     * @param searchResponse 发送请求之后的响应
     */
    void parseData( SearchResponse searchResponse){
        //解析拿到的数据
        //有用的数据都在这个对象里面
        SearchHits hits = searchResponse.getHits();
        //获取数据总数
        long total = hits.getTotalHits().value;
        System.out.println("数据总数:"+total);
        //这个数组里面存放的是每一条数据
        SearchHit[] searchHits = hits.getHits();
        for (SearchHit documentFields : searchHits) {
            String sourceJson = documentFields.getSourceAsString();
            HotelDoc hotelDoc = JSON.parseObject(sourceJson, HotelDoc.class);
            //进行高亮的结果解析
            Map<String, HighlightField> highlightFieldMap = documentFields.getHighlightFields();
            if(!CollectionUtils.isEmpty(highlightFieldMap)){
                HighlightField highlightField = highlightFieldMap.get("name");
                if(highlightField!=null){
                    //获取高亮处理后的name
                    String name = highlightField.fragments()[0].string();
                    hotelDoc.setName(name);
                }
                
            }
            System.out.println(hotelDoc);
        }
    }

1,matchAll查询(查询所有数据,但是只返回十条)

@Test
    void matchAllTest() throws IOException {
        //1,创建请求
        SearchRequest request=new SearchRequest("hotel");
        //2,准备请求参数
        request.source().query(QueryBuilders.matchAllQuery());
        //3,发送请求
        SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        //4,解析拿到的数据
        parseData(searchResponse);

    }

2,match查询(根据一个字段进行查询)


    /**
     * match查询,可以指定字段及逆行查询,但是只能指定一个
     * @throws IOException
     */
    @Test
    void matchTest() throws IOException {
        //1,创建请求
        SearchRequest request=new SearchRequest("hotel");
        //2,准备请求参数,针对all字段,对所有all中包含北京的进查询
        request.source().query(QueryBuilders.matchQuery("all","北京"));
        //因为es默认返回十条数据,我们如果向返回多一点,可以设置返回的数量
        request.source().size(20);
        //3,发送请求
        SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        //4,解析拿到的数据
        parseData(searchResponse);
    }

3,multi_match:(和match类似,但允许对多个字段进行查询)


    /**
     * multiMatch查询,可以指定多个字段
     * @throws IOException
     */
    @Test
    void multiMatchTest() throws IOException {
        SearchRequest request =new SearchRequest("hotel");
        //指定查询字段的值是多少,并指定那个字段,可以有多个,我们这里指定name,和city
        request.source().query(QueryBuilders.multiMatchQuery("北京","name","city"));
        SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        parseData(searchResponse);
    }
   
   

精准查询

精准查询-字段基本上是keyword类型的不可以在分词

term查询


    /**
     * term查询-根据词条精准查询
     * @throws IOException
     */
    @Test
    void termTest() throws IOException {
        SearchRequest request =new SearchRequest("hotel");
        //指定查询字段的值是多少,并指定那个字段,这个查询的值是固定的完全匹配的
        request.source().query(QueryBuilders.termQuery("city","上海"));
        SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        parseData(searchResponse);
    }

  

range查询


    /**
     * range查询-根据条件范围插寻
     * @throws IOException
     */
    @Test
    void rangTest() throws IOException {
        SearchRequest request =new SearchRequest("hotel");
        //指定词条进行范围插寻,查找评分从20到40 的酒店
        request.source().query(QueryBuilders.rangeQuery("score").gt(20).lt(40));
        SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        parseData(searchResponse);
    }

对查询结果做排序分页


    /**
     * 针对查询结果做排序和分页
     * @throws IOException
     */
    @Test
    void PageSortTest() throws IOException {
        int page=3;
        int size=5;
        SearchRequest request =new SearchRequest("hotel");
        //使用matchall查询所有酒店
        request.source().query(QueryBuilders.matchAllQuery());
        //对查询结果进行排序和分页,from:第几页。size;每页大小
        request.source().from((page-1)*size).size(size);
        //排序,针对价格字段降序,从高到低
        request.source().sort("price", SortOrder.DESC);
        SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        parseData(searchResponse);
    }

对查询结果做高亮处理

/**
     * 对查询结果高亮处理
     * @throws IOException
     */
    @Test
    void HignLightTest() throws IOException {
        SearchRequest request =new SearchRequest("hotel");
        //指定词条进行范围插寻,查找all字段中包含如家的酒店
        request.source().query(QueryBuilders.matchQuery("all","如家"));
        //查询后的name字段高亮处理,可以指定多个字段进行高亮
        request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
        SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        parseData(searchResponse);
    }

至此,es基础查询完结,了解更多,可查看官方文档!!!

Quick start | Elasticsearch Guide [8.13] | Elasticicon-default.png?t=N7T8https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html

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

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

相关文章

第07-4章 网络层详解

7.1 网络层协议 IP协议ARP&#xff08;地址解析协议&#xff09;RARP&#xff08;反向地址解析协议&#xff09;ICMP&#xff08;互联网控制消息协议&#xff09; 7.2 IP协议详解 7.2.1 IP协议功能 寻址和路由传递服务&#xff08;不可靠&#xff0c;尽最大努力&#xff0c…

牛客小白月赛91 ----- Bingbong的回文路径 ---- 题解

Bingbong的回文路径&#xff1a; 题目描述&#xff1a; 思路解析&#xff1a; 现在有一棵树&#xff0c;树上每个结点上都有一个小写字母&#xff0c;那么如果唯一确定了x和y两个结点&#xff0c;那么就唯一确定了一个字符串路径&#xff08;最短路径&#xff09;。 -现在给出…

linux内核初始化成功后是如何过渡到android初始化的

Android用的linux内核&#xff0c;以完成OS该有的功能&#xff0c;例如&#xff0c;文件系统&#xff0c;网络&#xff0c;内存管理&#xff0c;进程调度&#xff0c;驱动等 &#xff0c;向下管理硬件资源向上提供系统调用。另一些Android特有驱动也放在内核之中。 当linux内核…

Vue3+TS版本Uniapp:封装uni.request请求配置

作者&#xff1a;前端小王hs 阿里云社区博客专家/清华大学出版社签约作者✍/CSDN百万访问博主/B站千粉前端up主 封装请求配置项 封装拦截器封装uni.request 封装拦截器 uniapp的封装逻辑不同于Vue3项目中直接使用axios.create()方法创建实例&#xff08;在create方法中写入请求…

ChatGPT基础(三) 让ChatGPT回答质量提高十倍的提示词模版

上篇文章介绍了ChatGPT使用提示词的一些方法策略和如何优化我们的提示词。这里呢&#xff0c;我介绍一下参照大佬的方法总结的一个提示词的一个用法的模板。使用这个模板之后&#xff0c;我们的提问和获得答案的效率和收集素材的完整度能提高很多。 首先我介绍一下这个模板&am…

实战|哈尔滨等保2.0 Linux主机测评过程之身份鉴别

一、身份鉴别 a)应对登录的用户进行身份标识和鉴别&#xff0c;身份标识具有唯一性&#xff0c;身份鉴别信息具有复杂度要求并定期更换。 输入 more /etc/shadow,得知系统所有用户&#xff0c;此语句字段格式有九段。 第一字段&#xff1a;用户名&#xff08;也被称为登录名…

Nature Communications 构筑了具备优异形状记忆功能的聚合物材料

2024年2月29日&#xff0c;华东理工大学化学与分子工程学院、费林加诺贝尔奖科学家联合研究中心曲大辉教授团队在形状记忆功能聚合物材料研究中取得新进展&#xff0c;相关研究成果发表于《自然通讯》&#xff0c;这项研究取得了在形状记忆功能聚合物材料领域的新进展。研究团队…

国内ai人工智能软件大全

很多人一直在寻找一个稳定且可靠的全球AI大模型测试平台&#xff0c;希望它不仅真实可信&#xff0c;而且能提供稳定、快速的服务&#xff0c;不会频繁出现故障或响应缓慢。迄今为止&#xff0c;我已经尝试了国内外至少10个不同的服务站点。不幸的是&#xff0c;这些站点总是存…

【UE 材质】雨滴效果

在上一篇博客&#xff08;【UE 材质】表面湿润效果&#xff09;的基础上继续实现物体表面附加雨滴的效果 效果 步骤 1. 下载所需纹理 2. 创建一个材质并打开&#xff0c;添加如下节点&#xff0c;我们将纹理的RG通道输出的值和1组成一个三维向量&#xff0c;作为基本的法线效…

Shapley量化调峰成本?高比例可再生能源电力系统的调峰成本量化与分摊模型程序代码!

前言 在能源安全、环境污染和气候变化的大背景下&#xff0c;大力发展可再生能源是应对全球气候变化&#xff0c;实现“碳达峰、碳中和”和可持续发展的重大需求。截至2020年底&#xff0c;中国风电总装机容量为281GW&#xff0c;风力发电466.5TWh&#xff0c;同比增长约15%&a…

Reddit数据API 获取reddit的帖子、评论、按关键字搜索

近期调研发现 iDataRiver平台 https://www.idatariver.com/zh-cn/ 提供开箱即用的Reddit数据采集API&#xff0c;是目前用下来最方便简单的API&#xff0c;可以抓取 reddit 公开数据&#xff0c;例如 subreddit 中的帖子、按关键字搜索以及文章评论等&#xff0c;供用户按需调用…

【算法】实验室2024第一次考核复盘

【算法】实验室2024第一次考核复盘 本篇博客将遵循从易到难的原则&#xff0c;依次解析这几道考核题目。 原题链接&#xff1a; 125. 验证回文串 - 力扣&#xff08;LeetCode&#xff09; 使用两个指针i和j分别从字符串的两端开始&#xff0c;i从左往右&#xff0c;j从右往左。…

MySQL如何避免全表扫描?

MySQL如何避免全表扫描&#xff1f; 这篇文章解释了何时以及为什么MySQL会执行全表扫描来解析查询&#xff0c;以及如何避免在大型表上进行不必要的全表扫描。 何时会发生全表扫描 MySQL使用全表扫描&#xff08;在EXPLAIN输出中的type列显示为ALL&#xff09;来解析查询的几…

继东风一汽通信后,天磊咨询再次与东风集团达成深度业务合作

&#xff08;天磊咨询总经理&#xff1a;刘文喜&#xff09; 在风起云涌的市场激战中&#xff0c;天磊咨询凭借其出类拔萃的专业实力与服务品质&#xff0c;犹如一颗璀璨明星般脱颖而出&#xff0c;成功与赫赫有名的东风集团达成业务合作。这一合作的达成&#xff0c;不单彰显…

用java实现PDF的下载

1.下载PDF模版 2.导入依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.2.5</version><type>pom</type></dependency> 3.完整代码 package com.by.controller…

数据存储的大小端和测试程序

1.引言 计算机和嵌入式产品中数据的存储方式分为大端和小端两种方式。为什么呢&#xff1f;因为对于大多数设备都需要存储超过1个字节的数据单元。比如&#xff0c;你要表达0x12345678这个数字。使用1个字节的存储空间是肯定完成不了的。因此&#xff0c;你必须使用4个字节的空…

Postgres数据库中的死锁是如何产生的,如何避免和解决?

文章目录 死锁的产生原因如何避免死锁如何解决死锁示例代码查询死锁信息终止事务 在Postgres数据库中&#xff0c;死锁是一种特殊的情况&#xff0c;其中两个或多个事务相互等待对方释放资源&#xff0c;从而导致它们都无法继续执行。这种情况通常发生在多个事务尝试以不同的顺…

HarmonyOS NEXT 使用Canvas实现模拟时钟案例

介绍 本示例介绍利用 Canvas 和定时器实现模拟时钟场景&#xff0c;该案例多用于用户需要显示自定义模拟时钟的场景。 效果图预览 使用说明 无需任何操作&#xff0c;进入本案例页面后&#xff0c;所见即模拟时钟的展示。 使用说明 无需任何操作&#xff0c;进入本案例页…

2024化工制造企业数字化白皮书

来源&#xff1a;蓝凌研究院 中国石油和化学工业联合会发布2023年中国石油和化工行业经济运行情况。数据显示&#xff0c;2023年&#xff0c;我国石化行业实现营业收入15.95万亿元&#xff0c; 同比下降1.1%&#xff0c;利润总额8733.6亿元&#xff0c;行业经济运行总体呈现低…

FastJson2中FastJsonHttpMessageConverter找不到类问题

问题描述 如果你最近也在升级FastJson到FastJson2版本&#xff0c;而跟我一样也遇到了FastJsonHttpMessageConverter找不到类问题以及FastJsonConfig找不到问题&#xff0c;那么恭喜你&#xff0c;看完本文&#xff0c;安装完fastjson2、fastjson2-extension、fastjson2-exte…