ES_ChatGPT问答
Q1:springboot项目,如何使用elasticsearch的api增删改查?查询中有哪些方式,如果模糊查询、排序查询、分页查询?分别阐述下这些查询方式的用法?最后举一个完整的例子
答:
在Spring Boot项目中使用Elasticsearch的API增删改查,需要引入spring-boot-starter-data-elasticsearch依赖。该依赖会给我们提供基本的Elasticsearch操作,例如使用ElasticsearchRestTemplate进行增删改查操作。
使用ElasticsearchRestTemplate进行查询操作,我们可以通过NativeSearchQueryBuilder组装查询的条件。查询可以使用如下几种方式:
- Term查询:用于匹配精确的值,不进行分词
QueryBuilder queryBuilder = QueryBuilders.termQuery("field", "value");
- Match查询:用于根据分词查询
QueryBuilder queryBuilder = QueryBuilders.matchQuery("field", "value");
- Bool查询:用于多条件查询
QueryBuilder queryBuilder = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("field1", "value1"))
.must(QueryBuilders.matchQuery("field2", "value2"));
常见的查询操作,包括模糊查询、排序查询、分页查询,我们可以通过在构建查询条件时,分别加入相应的条件来实现。
- 模糊查询
模糊查询需要使用wildcardQuery或fuzzyQuery。其中,wildcardQuery是基于通配符的模糊查询,而fuzzyQuery则是基于编辑距离的模糊查询。
QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("field", "value*");
QueryBuilder queryBuilder = QueryBuilders.fuzzyQuery("field", "value");
- 排序查询
排序查询需要使用SortBuilder进行排序设置,排序字段需要在mapping设置。
NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
searchQueryBuilder.withSort(SortBuilders.fieldSort("field").order(SortOrder.ASC));
- 分页查询
分页查询需要使用PageRequest对分页参数进行设置,然后传递给ElasticsearchRestTemplate进行查询。
PageRequest pageRequest = PageRequest.of(pageNumber, pageSize);
NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
searchQueryBuilder.withPageable(pageRequest);
我们来看一个完整的示例,以模糊查询、排序查询、分页查询为例:
@Autowired
private ElasticsearchRestTemplate restTemplate;
public Page<Book> searchBooks(String keyword, int pageNumber, int pageSize) {
// 构建查询条件
QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("name", "*"+keyword+"*");
NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
// 使用查询条件
searchQueryBuilder.withQuery(queryBuilder);
// 分页
PageRequest pageRequest = PageRequest.of(pageNumber, pageSize);
searchQueryBuilder.withPageable(pageRequest);
// 排序
searchQueryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.ASC));
NativeSearchQuery searchQuery = searchQueryBuilder.build();
SearchHits<Book> searchHits = restTemplate.search(searchQuery, Book.class);
return searchHits.map(SearchHit::getContent);
}
其中,定义了一个Book实体类,包含id、name、price三个属性。searchBooks方法使用wildcardQuery实现模糊查询,使用PageRequest实现分页查询,使用fieldSort实现排序查询。最后使用ElasticsearchRestTemplate执行查询,并返回查询结果。
Q2:elasticsearch中储存的复杂的数据机构是怎么样的,举个复杂结构的例子?
答:
在Elasticsearch中Elasticsearch是基于Lucene的搜索引擎,支持嵌套的复杂结构。在Elasticsearch中,复杂数据结构以文档(Document)的方式储存,每个文档都由多个字段(Field)组成,每个字段可以是基本数据类型,也可以是对象类型,内部嵌套的对象类型被称为嵌套类型(Nested Type)。
下面是一个复杂结构的文档示例,它表示一个学生的信息,包括姓名、年龄、性别、所在学校、所在班级、选修的科目、成绩等信息。
{
"name": "小明",
"age": 18,
"gender": "male",
"school": {
"name": "清华大学",
"address": "北京市海淀区",
"country": "中国"
},
"class": {
"name": "高三(1)班",
"teachers": ["李老师", "张老师"],
"students": [
{
"name": "小明",
"age": 18,
"gender": "male"
},
{
"name": "小红",
"age": 17,
"gender": "female"
},
{
"name": "小刚",
"age": 18,
"gender": "male"
}
]
},
"courses": [
{
"name": "语文",
"teacher": "张老师",
"score": 90
},
{
"name": "数学",
"teacher": "李老师",
"score": 85
},
{
"name": "英语",
"teacher": "王老师",
"score": 92
}
]
}
可以看到,该文档中有嵌套的对象类型,包括school和class,class中又包括了一个嵌套的对象类型students,以及一个嵌套的简单数据类型teachers。courses是一个数组类型,包括多个嵌套的对象类型。
在Elasticsearch中,可以通过Mapping来指定文档中的字段类型和属性。对于嵌套类型,需要额外指定nested属性,才能支持嵌套查询。
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
},
"gender": {
"type": "keyword"
},
"school": {
"type": "object",
"properties": {
"name": {
"type": "text"
},
"address": {
"type": "text"
},
"country": {
"type": "keyword"
}
}
},
"class": {
"type": "object",
"properties": {
"name": {
"type": "text"
},
"teachers": {
"type": "keyword"
},
"students": {
"type": "nested",
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
},
"gender": {
"type": "keyword"
}
}
}
}
},
"courses": {
"type": "nested",
"properties": {
"name": {
"type": "text"
},
"teacher": {
"type": "keyword"
},
"score": {
"type": "integer"
}
}
}
}
}
}
通过这样的Mapping,就能在Elasticsearch中储存并查询复杂的嵌套结构数据。
ES_ChatGPT问答的更多相关文章
- Ext JS - 问答
Ext JS - 问答 在下面你将可以找到关于Ext JS 的最常见问题的答复.如果没有找到您所需的答复,请访问 Ext JS 论坛或者提交一个支持申请. 如果你确信你的问题可以对本页有补充,请让我们 ...
- https问答篇
https问答 SSL和TLS有什么区别? 可以说,TLS是SSL的升级版本,SSL是网景公司设计的,为了最早期的网络安全而生,它的全名叫做"安全套接层".后来,IETF在1999 ...
- 关于ArcGIS的Web 3D GIS问答
以下问答基于ArcGIS 10.4版本,涉及的软件有 ArcGIS for Server ArcGIS for Desktop ArcGIS Pro 1.3 Esri Drone2Map 1 支持B/ ...
- Linux常见疑难问答
Linux常见疑难问答 (1)按a~z顺序排列启动服务进程. #exportLC_ALL=C #英文环境变量设置,主要用于解决乱码问题 #chkconfig –list | gre ...
- [python](爬虫)如何使用正确的姿势欣赏知乎的“长得好看是怎样一种体验呢?”问答中的相片
从在知乎关注了几个大神,我发现我知乎的主页画风突变.经常会出现 ***长得好看是怎样一种体验呢? 不用***,却长得好看是一种怎样的体验? 什么样***作为头像? ... 诸如此类的问答.点进去之后发 ...
- JAVA多线程和并发基础面试问答(转载)
JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...
- 图灵机器人(问答机器人)API调用示例
问答机器人API文档:https://www.juhe.cn/docs/api/id/112 先上图: 说下大致实现的步骤: 1.首先使用了聚合数据的sdk,这样免费使用的数目可以多一些 2.使用gs ...
- BZOJ3636: 教义问答手册
Description “汉中沃野如关中,四五百里烟蒙蒙.黄云连天夏麦熟,水稻漠漠吹秋风.”——摘自 黄裳<汉中行>“泉岭精神不朽,汉中诸球永生.”——摘自<泉岭精神创立者语录> ...
- stack overflow--技术问答网站
转自:http://baike.baidu.com/link?url=eMR6Pwdk9IkauI5B3nZb2Yo3VUAcK6vQfrMpcSMPWqgH0ngqFkup3Gdr3t_s_yZe_ ...
- 裸设备和Oracle问答20例
导读裸设备,也叫裸分区(原始分区),是一种没有经过格式化,不被Unix通过文件系统来读取的特殊字符设备.裸设备可以绑定一个分区,也可以绑定一个磁盘.本文收集裸设备和Oracle问答20例. 1.什么叫 ...
随机推荐
- uni-app微信小程序文本框计数功能
<view> <textarea placeholder="请输入" @input="sumfontnum" :maxlength=" ...
- 盒模型属性-width height-padding-border-margin
宽度 width: 作用:设置可以添加元素内容的区域的宽度. 属性值: 特殊应用: • 如果一个元素不添加width 属性,默认属性值为auto,不同的元素浏览器会根据其 特点自动计算出实际宽度,例 ...
- Java常用几种加密算法(四种)
Java常用几种加密算法(四种) HChan 万丈红尘三杯酒,千秋大业一壶茶. 3 人赞同了该文章 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045-RF ...
- ReSharp的安装和使用教程
1.ReSharp的安装及破解: (1)不多说,直接上下载链接: 链接:https://pan.baidu.com/s/1cJmTQxDS-OHmHs46Q_hbMg 提取码:shiz (2)下载好解 ...
- MySQL数据库封锁机制和事务隔离级别
参考: 数据库技术:MySql学习笔记之事务隔离级别详解 详解MySQL 数据库隔离级别与MVCC MySQL 事务&&锁机制&&MVCC 数据库系统原理 - MySQ ...
- MarkDown使用规范
写博客的简单语法. 标题语法 一级标题:# 标题内容 二级标题:## +标题内容 三级标题:### +标题内容 后续标题语法依次增加# 注:#号后有空格 MarkDown最高支持六级标题. 字体语法 ...
- squad经验总结
啊美丽卡:M1A2 - TANKM2A3 - BLDL/M2A3M1126 - SCKMATV - RWS(电摇),ZCC(手摇)MATV(TOW) - TOW车M989 - 补给卡/运兵卡 俄军 8 ...
- logstash从MySQL导入数据到ES
下载安装 一定要对应ES版本(5.x,6.x,7.x) win下不用安装解压即用 , 解压目录不能带有空格和中文 , 否则会有奇奇怪怪的报错无法运行 win下要给logstash文件夹赋予管理员权限 ...
- Spring--AOP通知获取数据
AOP通知获取数据 获取参数 用before进行举例: 用around进行举例: 需要注意的是,Around的话,还可以处理一些之前发生异常的数据,直接在这里进行修改也是支持的: 获取返回值 环绕已经 ...
- RHEL系列邮箱配置mail.rc和s-nail.rc
RHEL8 1.首先安装postfix和mailx dnf install postfix mailx -y 2.开启postfix服务开机运行 systemctl enable --now post ...