SpringBoot操作ES进行各种高级查询(值得收藏),阿里P7大佬手把手教你

这篇具有很好参考价值的文章主要介绍了SpringBoot操作ES进行各种高级查询(值得收藏),阿里P7大佬手把手教你。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

for(SearchHit hit:searchHits){

// 文档的主键

String id = hit.getId();

// 源文档内容

Map<String, Object> sourceAsMap = hit.getSourceAsMap();

String name = (String) sourceAsMap.get(“name”);

// 由于前边设置了源文档字段过虑,这时description是取不到的

String description = (String) sourceAsMap.get(“description”);

// 学习模式

String studymodel = (String) sourceAsMap.get(“studymodel”);

// 价格

Double price = (Double) sourceAsMap.get(“price”);

// 日期

Date timestamp = dateFormat.parse((String) sourceAsMap.get(“timestamp”));

System.out.println(name);

System.out.println(studymodel);

System.out.println(“你看不见我,看不见我~” + description);

System.out.println(price);

}

}

坑:

执行过程中遇到的问题:不能对这个值进行初始化,导致 Spring 容器无法初始化

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'yunshangxue.elasticsearch.hostlist' in value "${yunshangxue.elasticsearch.hostlist}"

通过检查 target 目录发现,生成的 target 文件包中没有将 yml 配置文件带过来… 仔细对比发现,我的项目竟然变成了一个不是 Maven 的项目。重新使用 IDEA 导入 Mavaen 工程之后便能正常运行了。

推荐:Java面试练题宝典

分页查询

我们来 look 一下 ES 的分页查询参数:

{

// from 起始索引

// size 每页显示的条数

“from” : 0, “size” : 1,

“query”: {

“match_all”: {}

},

“_source” : [“name”,“studymodel”]

}

springboot es 分页查询,2024年程序员学习,spring boot,elasticsearch,后端

通过查询结果可以发现,我们设置了分页参数之后, hits.total 仍然是 3,表示它找到了 3 条数据,而按照分页规则,它只会返回一条数据,因此 hits.hits 里面只有一条数据。这也符合我们的业务规则,在查询前端页面显示总共的条数和当前的数据。

由此,我们就可以通过 Java API 来构建查询条件了:对上面查询全部的代码进行如下改造:

// 搜索源构建对象

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

int page = 2; // 页码

int size = 1; // 每页显示的条数

int index = (page - 1) * size;

searchSourceBuilder.from(index);

searchSourceBuilder.size(1);

// 搜索方式

// matchAllQuery搜索全部

searchSourceBuilder.query(QueryBuilders.matchAllQuery());

精确查询 TermQuery

Term Query为精确查询,在搜索时会整体匹配关键字,不再将关键字分词

例如:

{

“query”: {

“term”: { // 查询的方式为 term 精确查询

“name”: “spring” // 查询的字段为 name 关键字是 spring

}

},

“_source”: [

“name”,

“studymodel”

]

}

此时查询的结果是:

“hits”: [

{

“_index”: “ysx_course”,

“_type”: “doc”,

“_id”: “3”,

“_score”: 0.9331132,

“_source”: {

“studymodel”: “201001”,

“name”: “spring开发基础”

}

}

]

查询到了上面这条数据,因为 spring开发基础 分完词后是 spring 开发 基础 ,而查询关键字是 spring 不分词,这样当然可以匹配到这条记录,但是当我们修改关键字为 spring开发,按照往常的查询方法,也是可以查询到的。但是 term 不一样,它不会对关键字分词。结果可想而知是查询不到的

JavaAPI如下:

// 搜索方式

// termQuery 精确查询

searchSourceBuilder.query(QueryBuilders.termQuery(“studymodel”, “201002”));

根据 ID 查询:

根据 ID 精确查询和根据其他条件精确查询是一样的,不同的是 id 字段前面有一个下划线注意写上

searchSourceBuilder.query(QueryBuilders.termQuery(“_id”, “1”));

但是,当一次查询多个 ID 时,相应的 API 也应该改变,使用 termsQuery 而不是 termQuery。多了一个 s

全文检索 MatchQuery

MatchQuery 即全文检索,会对关键字进行分词后匹配词条。

query:搜索的关键字,对于英文关键字如果有多个单词则中间要用半角逗号分隔,而对于中文关键字中间可以用逗号分隔也可以不用

operator:设置查询的结果取交集还是并集,并集用 or, 交集用 and

{

“query”: {

“match”: {

“description”: {

“query”: “spring开发”,

“operator”: “or”

}

}

}

}

有时,我们需要设定一个量化的表达方式,例如查询 spring开发基础,这三个词条。我们需求是至少匹配两个词条,这时 operator 属性就不能满足要求了,ES 还提供了另外一个属性:minimum_should_match 用一个百分数来设定应该有多少个词条满足要求。例如查询:

“spring开发框架”会被分为三个词:spring、开发、框架

设置"minimum_should_match": "80%"表示,三个词在文档的匹配占比为80%,即3*0.8=2.4,向下取整得2,表示至少有两个词在文档中要匹配成功。

推荐:Java面试练题宝典

JavaAPI

通过 matchQuery.minimumShouldMatch 的方式来设置条件

// matchQuery全文检索

searchSourceBuilder.query(QueryBuilders.matchQuery(“description”, “Spring开发框架”).minimumShouldMatch(“70%”));

多字段联合搜索 MultiQuery

上面的 MatchQuery 有一个短板,假如用户输入了某关键字,我们在查找的时候并不知道他输入的是 name 还是 description,这时我们用什么都不合适,而 MultiQuery 的出现解决了这个问题,他可以通过 fields 属性来设置多个域联合查找:具体用法如下

{

“query”: {

“multi_match”: {

“query”: “Spring开发”,

“minimum_should_match”: “70%”,

“fields”: [“name”, “description”]

}

}

}

JavaAPI

searchSourceBuilder.query(QueryBuilders.multiMatchQuery(“Spring开发框架”, “name”, “description”).minimumShouldMatch(“70%”));

提升 boost

在多域联合查询的时候,可以通过 boost 来设置某个域在计算得分时候的比重,比重越高的域当他符合条件时计算的得分越高,相应的该记录也更靠前。通过在 fields 中给相应的字段用 ^权重倍数来实现

“fields”: [“name^10”, “description”]

上面的代码表示给 name 字段提升十倍权重,查询到的结果:

{

“_index”: “ysx_course”,

“_type”: “doc”,

“_id”: “3”,

“_score”: 13.802518, // 可以清楚的发现,得分竟然是 13 了

“_source”: {

“name”: “spring开发基础”,

“description”: “spring 在java领域非常流行,java程序员都在用。”,

“studymodel”: “201001”,

“price”: 88.6,

“timestamp”: “2018-02-24 19:11:35”,

“pic”: “group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg”

}

},

而在 Java 中,仍然可以通过链式编程来实现

searchSourceBuilder.query(QueryBuilders.multiMatchQuery(“Spring开发框架”, “name”, “description”).field(“name”, 10)); // 设置 name 10倍权重

布尔查询 BoolQuery

如果我们既要对一些字段进行分词查询,同时要对另一些字段进行精确查询,就需要使用布尔查询来实现了。布尔查询对应于Lucene的BooleanQuery查询,实现将多个查询组合起来,有三个可选的参数:

must:文档必须匹配must所包括的查询条件,相当于 “AND”

should:文档应该匹配should所包括的查询条件其中的一个或多个,相当于 “OR”

must_not:文档不能匹配must_not所包括的该查询条件,相当于“NOT”

{

“query”: {

“bool”: { // 布尔查询

“must”: [ // 查询条件 must 表示数组中的查询方式所规定的条件都必须满足

{

“multi_match”: {

“query”: “spring框架”,

“minimum_should_match”: “50%”,

“fields”: [

“name^10”,

“description”

]

}

},

{

“term”: {

“studymodel”: “201001”

}

}

]

}

}

}

JavaAPI

// 搜索方式

// 首先构造多关键字查询条件

MultiMatchQueryBuilder matchQueryBuilder = QueryBuilders.multiMatchQuery(“Spring开发框架”, “name”, “description”).field(“name”, 10);

// 然后构造精确匹配查询条件

TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery(“studymodel”, “201002”);

// 组合两个条件,组合方式为 must 全满足

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

boolQueryBuilder.must(matchQueryBuilder);

boolQueryBuilder.must(termQueryBuilder);

// 将查询条件封装给查询对象

searchSourceBuilder.query(boolQueryBuilder);

过滤器

定义过滤器查询,是在原本查询结果的基础上对数据进行筛选,因此省略了重新计算的分的步骤,效率更高。并且方便缓存。推荐尽量使用过虑器去实现查询或者过虑器和查询共同使用,过滤器在布尔查询中使用,下边是在搜索结果的基础上进行过滤:

{

“query”: {

“bool”: {

“must”: [

{

“multi_match”: {

“query”: “spring框架”,

“minimum_should_match”: “50%”,

“fields”: [

“name^10”,

“description”

]

}

}

],

“filter”: [

{

// 过滤条件:studymodel 必须是 201001

“term”: {“studymodel”: “201001”}

},

{

// 过滤条件:价格 >=60 <=100

“range”: {“price”: {“gte”: 60,“lte”: 100}}

}

]

}

}

}

注意:range和term一次只能对一个Field设置范围过虑。

JavaAPI

// 首先构造多关键字查询条件

MultiMatchQueryBuilder matchQueryBuilder = QueryBuilders.multiMatchQuery(“Spring框架”, “name”, “description”).field(“name”, 10);

// 添加条件到布尔查询

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

boolQueryBuilder.must(matchQueryBuilder);

// 通过布尔查询来构造过滤查询

boolQueryBuilder.filter(QueryBuilders.termQuery(“studymodel”, “201001”));

boolQueryBuilder.filter(QueryBuilders.rangeQuery(“price”).gte(60).lte(100));

// 将查询条件封装给查询对象

searchSourceBuilder.query(boolQueryBuilder);

排序

我们可以在查询的结果上进行二次排序,支持对 keyword、date、float 等类型添加排序,text类型的字段不允许排序。排序使用的 JSON 格式如下:

{

“query”: {

“bool”: {

“filter”: [

{

“range”: {

“price”: {

“gte”: 0,

“lte”: 100

}

}

}

]

}

},

“sort”: [ // 注意这里排序是写在 query key 的外面的。这就表示它的API也不是布尔查询提供

{

“studymodel”: “desc” // 对 studymodel(keyword)降序

},

{

“price”: “asc” // 对 price(double)升序

}

]

}

由上面的 JSON 数据可以发现,排序所属的 API 是和 query 评级的,因此在调用 API 时也应该选择对应的 SearchSourceBuilder 对象

// 排序查询

@Test

public void testSort() throws IOException, ParseException {

// 搜索请求对象

SearchRequest searchRequest = new SearchRequest(“ysx_course”);

// 指定类型

searchRequest.types(“doc”);

// 搜索源构建对象

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

// 搜索方式

// 添加条件到布尔查询

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

// 通过布尔查询来构造过滤查询

boolQueryBuilder.filter(QueryBuilders.rangeQuery(“price”).gte(0).lte(100));

// 将查询条件封装给查询对象

searchSourceBuilder.query(boolQueryBuilder);

// 向搜索请求对象中设置搜索源

searchRequest.source(searchSourceBuilder);

// 设置排序规则

searchSourceBuilder.sort(“studymodel”, SortOrder.DESC); // 第一排序规则

searchSourceBuilder.sort(“price”, SortOrder.ASC); // 第二排序规则

// 执行搜索,向ES发起http请求

SearchResponse searchResponse = client.search(searchRequest);

// 搜索结果

SearchHits hits = searchResponse.getHits();

// 匹配到的总记录数

long totalHits = hits.getTotalHits();

// 得到匹配度高的文档

SearchHit[] searchHits = hits.getHits();

// 日期格式化对象

soutData(searchHits);

}

高亮显示

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
springboot es 分页查询,2024年程序员学习,spring boot,elasticsearch,后端
springboot es 分页查询,2024年程序员学习,spring boot,elasticsearch,后端
springboot es 分页查询,2024年程序员学习,spring boot,elasticsearch,后端

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
springboot es 分页查询,2024年程序员学习,spring boot,elasticsearch,后端

读者福利

springboot es 分页查询,2024年程序员学习,spring boot,elasticsearch,后端

更多笔记分享

springboot es 分页查询,2024年程序员学习,spring boot,elasticsearch,后端

earchHits hits = searchResponse.getHits();

// 匹配到的总记录数

long totalHits = hits.getTotalHits();

// 得到匹配度高的文档

SearchHit[] searchHits = hits.getHits();

// 日期格式化对象

soutData(searchHits);

}

高亮显示

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-89dZ6vAB-1711155995487)]
[外链图片转存中…(img-zklbwSe7-1711155995488)]
[外链图片转存中…(img-ou6Iy4Hc-1711155995489)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-A4BUoMjE-1711155995489)]

读者福利

[外链图片转存中…(img-7uKs5bkw-1711155995489)]

更多笔记分享

[外链图片转存中…(img-zDfnj2R6-1711155995490)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录文章来源地址https://www.toymoban.com/news/detail-856746.html

到了这里,关于SpringBoot操作ES进行各种高级查询(值得收藏),阿里P7大佬手把手教你的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Android架构进阶之高级UI系列(精编解析,值得收藏)

    public FrameHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_DO_FRAME: // 执行doFrame // 如果启用VSYNC机制,当VSYNC信号到来时触发 doFrame(System.nanoTime(), 0); break; case MSG_DO_SCHEDULE_VSYNC: // 申请VSYNC信号,例如当前需要绘制任务时 doScheduleVsync()

    2024年04月14日
    浏览(59)
  • Elasticsearch8.8.0 SpringBoot实战操作各种案例(索引操作、聚合、复杂查询、嵌套等)

    Elasticsearch8.8.0 全网最新版教程 从入门到精通 通俗易懂 引入依赖 添加配置文件 application.yaml 导入ca证书到项目中 从任意一个es容器中,拷贝证书到resources目录下 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EXytUrDp-1691330960034)(media/16912196423122/16

    2024年02月13日
    浏览(58)
  • Android架构进阶之高级UI系列(精编解析,值得收藏),Android开发面试技能介绍

    CallbackRecord callbacks; synchronized (mLock) { final long now = System.nanoTime(); // 根据指定的类型CallbackkQueue中查找到达执行时间的CallbackRecord callbacks = mCallbackQueues[callbackType].extractDueCallbacksLocked( now / TimeUtils.NANOS_PER_MS); if (callbacks == null) { return; } mCallbacksRunning = true; if (callbackType == Choreograph

    2024年04月13日
    浏览(42)
  • 原生语言操作和spring data中RestHighLevelClient操作Elasticsearch,索引,文档的基本操作,es的高级查询.查询结果处理. 数据聚合.相关性系数打分

    ​ Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasti

    2024年02月05日
    浏览(86)
  • C#操作MySQL从入门到精通(8)——对查询数据进行高级过滤

    我们在查询数据库中数据的时候,有时候需要剔除一些我们不想要的数据,这时候就需要对数据进行过滤,比如学生信息中,我只需要年龄等于18的,同时又要家乡地址是安徽的,类似这种操作专栏第7篇的C#操作MySQL从入门到精通(7)——对查询数据进行简单过滤简单过滤方法就

    2024年04月15日
    浏览(52)
  • 在SpringBoot中对es集群的查询操作

                将以上代码复制到kibana的控制台上运行          运行完后可以到打开head插件查看信息           数据准备完成后我们就可以开始查询了                  通过上述两个查询我们发现,查询数据的时候会有很多冗余的部分,所以我们可以将这一部分代码进

    2024年02月12日
    浏览(43)
  • 微信小程序备案流程操作详解,值得收藏

    目录 一、小程序备案法律法规参考 二、备案前准备 2.1 备案入口 2.1.1、未上架小程序 2.1.2、已上架小程序 (二)备案类型 (三)备案材料准备 3.1、小程序备案材料 3.2、前置审批材料 3.3、个人备案 3.4、非个人备案 三、备案整体流程 (一)备案信息填写 1、主体信息填写 2、主体负责

    2024年02月04日
    浏览(45)
  • 【SpringBoot笔记28】SpringBoot集成ES数据库之操作doc文档(创建、更新、删除、查询)

    这篇文章,主要介绍SpringBoot集成ES数据库之操作doc文档(创建、更新、删除、查询)。 目录 一、SpringBoot操作ES文档数据 1.1、创建文档 1.2、更新文档 1.3、删除文档

    2024年02月08日
    浏览(51)
  • ES各种查询语法及响应结果

    目录 查询 创建 删除请求 1. 删除索引  数据类型 一、创建索引     1.1 创建book_test索引     1.2 查看索引映射     1.3 添加文档记录     1.4 查询文档     1.6 删除文档中某一条数据 二、查询语法 2.1 termterms查询 2.2 match查询属于高层查询,他会根据你查询的字段类型不一样

    2023年04月09日
    浏览(42)
  • ES6-ES11最通俗易懂保姆级的笔记!人见人爱,花见花开。赶快动起你发财的小手收藏起来吧,满满的干货,你值得拥有!!

    1.  ES6 1.1  let变量声明以及声明特性 声明变量 特性: 变量不能重复声明 块级作用域 全局、函数、eval 不仅仅针对花括号,if else while for中都是块级作用域 不存在变量提升 不影响作用域链  案例 1.2  const声明常量以及特点 常量声明 特性: 一定要赋初始值 一般变量使用大

    2024年02月09日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包