ES_ChatGPT问答

打印 上一主题 下一主题

主题 577|帖子 577|积分 1731

Q1:springboot项目,如何使用elasticsearch的api增删改查?查询中有哪些方式,如果模糊查询、排序查询、分页查询?分别阐述下这些查询方式的用法?最后举一个完整的例子

答:
在Spring Boot项目中使用Elasticsearch的API增删改查,需要引入spring-boot-starter-data-elasticsearch依赖。该依赖会给我们提供基本的Elasticsearch操作,例如使用ElasticsearchRestTemplate进行增删改查操作。
使用ElasticsearchRestTemplate进行查询操作,我们可以通过NativeSearchQueryBuilder组装查询的条件。查询可以使用如下几种方式:

  • Term查询:用于匹配精确的值,不进行分词
  1. QueryBuilder queryBuilder = QueryBuilders.termQuery("field", "value");
复制代码

  • Match查询:用于根据分词查询
  1. QueryBuilder queryBuilder = QueryBuilders.matchQuery("field", "value");
复制代码

  • Bool查询:用于多条件查询
  1. QueryBuilder queryBuilder = QueryBuilders.boolQuery()
  2.         .must(QueryBuilders.matchQuery("field1", "value1"))
  3.         .must(QueryBuilders.matchQuery("field2", "value2"));
复制代码
常见的查询操作,包括模糊查询、排序查询、分页查询,我们可以通过在构建查询条件时,分别加入相应的条件来实现。

  • 模糊查询
模糊查询需要使用wildcardQuery或fuzzyQuery。其中,wildcardQuery是基于通配符的模糊查询,而fuzzyQuery则是基于编辑距离的模糊查询。
  1. QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("field", "value*");
  2. QueryBuilder queryBuilder = QueryBuilders.fuzzyQuery("field", "value");
复制代码

  • 排序查询
排序查询需要使用SortBuilder进行排序设置,排序字段需要在mapping设置。
  1. NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
  2. searchQueryBuilder.withSort(SortBuilders.fieldSort("field").order(SortOrder.ASC));
复制代码

  • 分页查询
分页查询需要使用PageRequest对分页参数进行设置,然后传递给ElasticsearchRestTemplate进行查询。
  1. PageRequest pageRequest = PageRequest.of(pageNumber, pageSize);
  2. NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
  3. searchQueryBuilder.withPageable(pageRequest);
复制代码
我们来看一个完整的示例,以模糊查询、排序查询、分页查询为例:
  1. @Autowired
  2. private ElasticsearchRestTemplate restTemplate;
  3. public Page<Book> searchBooks(String keyword, int pageNumber, int pageSize) {
  4.     // 构建查询条件
  5.     QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("name", "*"+keyword+"*");
  6.    
  7.     NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
  8.     // 使用查询条件
  9.     searchQueryBuilder.withQuery(queryBuilder);
  10.     // 分页
  11.     PageRequest pageRequest = PageRequest.of(pageNumber, pageSize);
  12.     searchQueryBuilder.withPageable(pageRequest);
  13.     // 排序
  14.     searchQueryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.ASC));
  15.     NativeSearchQuery searchQuery = searchQueryBuilder.build();
  16.     SearchHits<Book> searchHits = restTemplate.search(searchQuery, Book.class);
  17.     return searchHits.map(SearchHit::getContent);
  18. }
复制代码
其中,定义了一个Book实体类,包含id、name、price三个属性。searchBooks方法使用wildcardQuery实现模糊查询,使用PageRequest实现分页查询,使用fieldSort实现排序查询。最后使用ElasticsearchRestTemplate执行查询,并返回查询结果。
Q2:elasticsearch中储存的复杂的数据机构是怎么样的,举个复杂结构的例子?

答:
在Elasticsearch中Elasticsearch是基于Lucene的搜索引擎,支持嵌套的复杂结构。在Elasticsearch中,复杂数据结构以文档(Document)的方式储存,每个文档都由多个字段(Field)组成,每个字段可以是基本数据类型,也可以是对象类型,内部嵌套的对象类型被称为嵌套类型(Nested Type)。
下面是一个复杂结构的文档示例,它表示一个学生的信息,包括姓名、年龄、性别、所在学校、所在班级、选修的科目、成绩等信息。
  1. {
  2.     "name": "小明",
  3.     "age": 18,
  4.     "gender": "male",
  5.     "school": {
  6.         "name": "清华大学",
  7.         "address": "北京市海淀区",
  8.         "country": "中国"
  9.     },
  10.     "class": {
  11.         "name": "高三(1)班",
  12.         "teachers": ["李老师", "张老师"],
  13.         "students": [
  14.             {
  15.                 "name": "小明",
  16.                 "age": 18,
  17.                 "gender": "male"
  18.             },
  19.             {
  20.                 "name": "小红",
  21.                 "age": 17,
  22.                 "gender": "female"
  23.             },
  24.             {
  25.                 "name": "小刚",
  26.                 "age": 18,
  27.                 "gender": "male"
  28.             }
  29.         ]
  30.     },
  31.     "courses": [
  32.         {
  33.             "name": "语文",
  34.             "teacher": "张老师",
  35.             "score": 90
  36.         },
  37.         {
  38.             "name": "数学",
  39.             "teacher": "李老师",
  40.             "score": 85
  41.         },
  42.         {
  43.             "name": "英语",
  44.             "teacher": "王老师",
  45.             "score": 92
  46.         }
  47.     ]
  48. }
复制代码
可以看到,该文档中有嵌套的对象类型,包括school和class,class中又包括了一个嵌套的对象类型students,以及一个嵌套的简单数据类型teachers。courses是一个数组类型,包括多个嵌套的对象类型。
在Elasticsearch中,可以通过Mapping来指定文档中的字段类型和属性。对于嵌套类型,需要额外指定nested属性,才能支持嵌套查询。
  1. {
  2.   "mappings": {
  3.     "properties": {
  4.       "name": {
  5.         "type": "text"
  6.       },
  7.       "age": {
  8.         "type": "integer"
  9.       },
  10.       "gender": {
  11.         "type": "keyword"
  12.       },
  13.       "school": {
  14.         "type": "object",
  15.         "properties": {
  16.           "name": {
  17.             "type": "text"
  18.           },
  19.           "address": {
  20.             "type": "text"
  21.           },
  22.           "country": {
  23.             "type": "keyword"
  24.           }
  25.         }
  26.       },
  27.       "class": {
  28.         "type": "object",
  29.         "properties": {
  30.           "name": {
  31.             "type": "text"
  32.           },
  33.           "teachers": {
  34.             "type": "keyword"
  35.           },
  36.           "students": {
  37.             "type": "nested",
  38.             "properties": {
  39.               "name": {
  40.                 "type": "text"
  41.               },
  42.               "age": {
  43.                 "type": "integer"
  44.               },
  45.               "gender": {
  46.                 "type": "keyword"
  47.               }
  48.             }
  49.           }
  50.         }
  51.       },
  52.       "courses": {
  53.         "type": "nested",
  54.         "properties": {
  55.           "name": {
  56.             "type": "text"
  57.           },
  58.           "teacher": {
  59.             "type": "keyword"
  60.           },
  61.           "score": {
  62.             "type": "integer"
  63.           }
  64.         }
  65.       }
  66.     }
  67.   }
  68. }
复制代码
通过这样的Mapping,就能在Elasticsearch中储存并查询复杂的嵌套结构数据。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

雁过留声

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表