首页 > 其他分享 >ES_ChatGPT问答

ES_ChatGPT问答

时间:2023-04-10 14:46:38浏览次数:34  
标签:name 问答 查询 嵌套 searchQueryBuilder ChatGPT type QueryBuilders ES

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

答:

在Spring Boot项目中使用Elasticsearch的API增删改查,需要引入spring-boot-starter-data-elasticsearch依赖。该依赖会给我们提供基本的Elasticsearch操作,例如使用ElasticsearchRestTemplate进行增删改查操作。

使用ElasticsearchRestTemplate进行查询操作,我们可以通过NativeSearchQueryBuilder组装查询的条件。查询可以使用如下几种方式:

  1. Term查询:用于匹配精确的值,不进行分词
QueryBuilder queryBuilder = QueryBuilders.termQuery("field", "value");
  1. Match查询:用于根据分词查询
QueryBuilder queryBuilder = QueryBuilders.matchQuery("field", "value");
  1. Bool查询:用于多条件查询
QueryBuilder queryBuilder = QueryBuilders.boolQuery()
        .must(QueryBuilders.matchQuery("field1", "value1"))
        .must(QueryBuilders.matchQuery("field2", "value2"));

常见的查询操作,包括模糊查询、排序查询、分页查询,我们可以通过在构建查询条件时,分别加入相应的条件来实现。

  1. 模糊查询

模糊查询需要使用wildcardQueryfuzzyQuery。其中,wildcardQuery是基于通配符的模糊查询,而fuzzyQuery则是基于编辑距离的模糊查询。

QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("field", "value*");
QueryBuilder queryBuilder = QueryBuilders.fuzzyQuery("field", "value");
  1. 排序查询

排序查询需要使用SortBuilder进行排序设置,排序字段需要在mapping设置。

NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
searchQueryBuilder.withSort(SortBuilders.fieldSort("field").order(SortOrder.ASC));
  1. 分页查询

分页查询需要使用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实体类,包含idnameprice三个属性。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
        }
    ]
}

可以看到,该文档中有嵌套的对象类型,包括schoolclassclass中又包括了一个嵌套的对象类型students,以及一个嵌套的简单数据类型teacherscourses是一个数组类型,包括多个嵌套的对象类型。

在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中储存并查询复杂的嵌套结构数据。

标签:name,问答,查询,嵌套,searchQueryBuilder,ChatGPT,type,QueryBuilders,ES
From: https://www.cnblogs.com/kakarotto-chen/p/17302851.html

相关文章

  • Docker容器执行su命令报错su: cannot open session: Permission denied 解决方法
    1、先检查su命令权限是否正确,执行如下命令ll/etc/pam.d/su如果现实如图,则说明权限方面没问题,若您的执行结果与我的不一样,需调整权限。[root@blog-tag-gg~]#ll/etc/pam.d/su-rw-r--r--1rootroot5402月32021/etc/pam.d/su2、执行如下命令将如下。将su文......
  • k8s 会把自己的ca.pem 注入到 /var/run/secrets/kubernetes.io/serviceaccount/ 目录
     k8s会把自己的ca.pem注入到/var/run/secrets/kubernetes.io/serviceaccount/目录下 生成三个文件lrwxrwxrwx1rootroot13Dec1201:56ca.crt->..data/ca.crtlrwxrwxrwx1rootroot16Dec1201:56namespace->..data/namespacelrwxrwxrwx1rootroot12D......
  • 保护和升级PostgreSQL
    PostgresqlPostgreSQL是一种流行的开源关系型数据库管理系统,被许多组织用于存储和管理他们的数据。然而,数据库系统中的数据很容易受到攻击和泄露,因此必须采取安全措施和定期进行升级。本文介绍了保护和升级PostgreSQL的一些方法。一、开启审计PostgreSQL支持审计功能,可以记录......
  • vscode保存时自动ESLint格式化(vue)
    一、安装eslint  二、vscode全局配置2.1打开设置   2.2打开settings.json  2.3在settings.json中添加eslint配置{"code-runner.runInTerminal":true,"eslint.format.enable":true,//以下是eslint配置//vscode默认启用了根据文件......
  • AtCoder Regular Contest 159
    Preface这周六紧张刺激的一日三赛,上午蓝桥杯,晚上ARC之后隔5min就是CF,可谓是手搓键盘到冒烟的一天了这场其实打的感觉很没水准,B刚开始没想清楚很多边界条件挂了三发,45min左右才过然后C的构造也不太会,随便写了个暴力也是挂挂挂,只好弃了去写D题了结果发现D题好像是个不难的线段树......
  • ChatGPT垂直行业私有数据知识库功能-咨询接口采用流式响应输出-JS和Golang实现流式响
    近期开发私有数据知识库功能,想要实现和ChatGPT聊天效果类似的逐字流式输出展示效果。GPT3.5本身就有流式聊天补全接口,后端Golang对接后,也需要能流式输出。下面就介绍下前端JS后端Golang来实现这种输出效果 大部分介绍是使用EventStream来实现,我现在不使用EventStream也来实现......
  • Codeforces Round 863 (Div. 3)
    题解报告基本的一些理解和问题都在注释中A:InsertDigit找到第一个小于输入数字的数的位置塞进去就好了,可以细推,但是粗略想想也能知道#include<bits/stdc++.h>usingnamespacestd;intmain(void){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int......
  • Codeforces Round 865 (Div. 2)
    CodeforcesRound865(Div.2)A.IanVisitsMaryvoidsolve(){intx=read(),y=read();if(__gcd(y,x)!=1){cout<<2<<endl;cout<<1<<""<<y-1<<endl;cout<<x<<"&q......
  • OpenTiny 跨端、跨框架组件库升级TypeScript,10万行代码重获新生
    摘要:一份精心准备的《JS项目改造TS指南》文档供大家参考,顺便介绍TS基础知识和TS在Vue中的实践。本文分享自华为云社区《历史性的时刻!OpenTiny跨端、跨框架组件库正式升级TypeScript,10万行代码重获新生!》,作者:Kagol。根据TheSoftwareHouse发布的《2022前端开发市场状......
  • 第5章 使用路由将URL映射到Razor Pages(ASP.NET Core in Action, 2nd Edition)
    本章包括(请点击这里阅读其他章节)将URL映射到Razor页面使用约束和默认值匹配URL从路由参数生成URL在第4章中,您了解了MVC设计模式,以及ASP.NETCore如何使用它为使用RazorPages的应用程序生成UI。RazorPages包含类似小型控制器的页面处理程序。页面处理程序......