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中储存并查询复杂的嵌套结构数据。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)