您当前的位置:首页 > 电脑百科 > 人工智能

借助ChatGPT快速上手ElasticSearch dsl

时间:2023-06-10 13:42:43  来源:今日头条  作者:赵帅虎

作为一个SQL玩家,接触到 ElasticSearch 以后,被其dsl奇奇怪怪的写法所困扰,比如 bool should filter 什么场景下应该嵌套,什么时候 bool query是必须的,什么时候可以干掉。排查问题时,不可避免地需要手写dsl,经常收到ES报错。

ChatGPT ElasticSearch

为了解决这个问题,我尝试让ChatGPT给我做翻译,效果还不错。下面我们按照场景来看。

场景一: 列表模糊查询

在B端后台系统的列表页里,我们通常可以看到很多筛选框。产品经理经常把按 ID 和 Name 模糊匹配的功能放到一个筛选框,名曰“更好的用户体验”。如果用SQL写的话,非常简单:

select * from user 
where client_id = 123 
and  user_id like '%张三%' or user_name like '%张三%';

如果存储在MySQL,加上client_id索引就可以大大减少筛选出的数据量,性能不会太差。

如果数据量非常大,那就用ES吧。我们可以对ChatGPT这样提问:

-------- 提问开始 --------

ES index 名字 "user",有三个字段

  1. user_id string
  2. user_name string
  3. client_id int
    我要查询带有以下条件的记录:client_id = 123 and (user_name = '张三' or user_id = '张三')。dsl应该怎么写?

-------- 回复开始 --------

要查询 "user" 索引中满足以下条件的记录:client_id = 123 and (user_name = '张三' or user_id = '张三'),可以使用 bool 查询结合 term 查询来实现。以下是相应的 DSL 查询示例:

GET /user/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "client_id": 123
          }
        },
        {
          "bool": {
            "should": [
              {
                "term": {
                  "user_name": "张三"
                }
              },
              {
                "term": {
                  "user_id": "张三"
                }
              }
            ]
          }
        }
      ]
    }
  }
}

在这个查询中,我们使用了 bool 查询来确保指定的条件被用于过滤文档。

在 filter 子句中,我们有两个条件:一个是针对 "client_id" 字段的值为 123 的条件,使用了 term 查询。第二个条件是一个嵌套的 bool 查询,其中包含一个 should 子句。should 子句中包含了两个 term 查询:一个是针对 "user_name" 字段,另一个是针对 "user_id" 字段,它们都检查值是否为 "张三"。通过使用 should 子句,我们表示其中任一条件匹配即可。

这个 DSL 查询将返回满足 client_id 为 123,并且用户名为 "张三" 或用户ID为 "张三" 的文档记录。

-------- 回复结束 --------

ChatGPT 不只给出了答案,也给出了解释,我们针对业务里的index做一下修改就好。

场景二: 根据聚合结果进行过滤 having

基于上面的 user 表,我们再加一个 ticket_id 字段,表示处理过的工单,我们要查出处理工单超过100个的用户。SQL可以这样写:

select 
  user_id, 
  max(user_name) as user_name,
  count(ticket_id) as ticket_cnt 
from user 
where client_id = 123
having count(ticket_id) > 100;

向ChatGPT提问:

-------- 提问开始 --------

ES index 名字 "user",包含以下字段:

  1. user_id string
  2. user_name string
  3. client_id int
  4. ticket_id
    按照 user_id 聚合,查询 count(ticket_id) > 100 的 user_id,以及user_id对应的 user_name

-------- 回复开始 --------
要按照 "user_id" 字段进行聚合,并查询符合条件 count(ticket_id) > 100 的 "user_id",以及对应的 "user_name",可以使用聚合查询中的 terms 聚合和 bucket_selector 管道聚合来实现。以下是相应的 DSL 查询示例:

GET /user/_search
{
  "size": 0,
  "aggs": {
    "users": {
      "terms": {
        "field": "user_id",
        "size": 10,
        "min_doc_count": 101  // 设置最小文档数,只返回 count(ticket_id) > 100 的聚合结果
      },
      "aggs": {
        "user_name": {
          "terms": {
            "field": "user_name",
            "size": 1
          }
        },
        "ticket_count": {
          "value_count": {
            "field": "ticket_id"
          }
        },
        "bucket_filter": {
          "bucket_selector": {
            "buckets_path": {
              "count": "ticket_count"
            },
            "script": "params.count > 100"  // 仅保留 count(ticket_id) > 100 的聚合桶
          }
        }
      }
    }
  }
}

在这个查询中,我们使用了 terms 聚合对 "user_id" 字段进行分组,并在聚合结果中嵌套了 user_name 字段的 terms 聚合和 ticket_id 字段的 value_count 聚合。

在 terms 聚合中,我们设置了 min_doc_count 参数为 101,以仅返回满足 count(ticket_id) > 100 的聚合桶。这样可以过滤掉不满足条件的聚合结果。

最终,我们使用 bucket_selector 管道聚合来进行桶过滤,仅保留满足条件 params.count > 100 的聚合桶。这样,最终的聚合结果中将只包含满足条件的 "user_id" 和对应的 "user_name"。

请注意,根据您的具体需求,您可能需要根据实际情况调整聚合查询中的参数和设置,如设置合适的 size 值来控制返回的聚合桶数量等。

-------- 回复结束 --------

场景三: 聚合以后取topK

向ChatGPT提问:

-------- 提问开始 --------

ES index 名字 "user",包含以下字段:

  1. user_id string
  2. user_name string
  3. client_id int
  4. ticket_id
    我要查询处理ticket数量top10 的 user_id 以及对应的user_name

-------- 回复开始 --------
要查询处理 ticket 数量排名前 10 的 "user_id",以及对应的 "user_name",可以使用 terms 聚合和 top_hits 子聚合来实现。以下是相应的 DSL 查询示例:

GET /user/_search
{
  "size": 0,
  "aggs": {
    "top_users": {
      "terms": {
        "field": "user_id",
        "size": 10,
        "order": {
          "ticket_count": "desc"
        }
      },
      "aggs": {
        "user_name": {
          "terms": {
            "field": "user_name",
            "size": 1
          }
        },
        "ticket_count": {
          "value_count": {
            "field": "ticket_id"
          }
        },
        "top_user_hits": {
          "top_hits": {
            "size": 1
          }
        }
      }
    }
  }
}

在这个查询中,我们使用了 terms 聚合对 "user_id" 字段进行分组,并按照 "ticket_count" 字段的降序对分组结果进行排序。

在 terms 聚合中,我们设置了 size 参数为 10,以仅返回前 10 个处理 ticket 数量最多的 "user_id"。

在每个聚合桶中,我们还嵌套了 user_name 字段的 terms 聚合和 ticket_id 字段的 value_count 聚合,分别用于获取对应的 "user_name" 和计算 ticket 数量。

此外,我们使用了 top_hits 子聚合来获取每个聚合桶中的匹配文档的详细信息。在这里,我们设置了 size 参数为 1,以仅获取每个聚合桶中的一条文档信息。

最终,聚合查询的结果将包含处理 ticket 数量排名前 10 的 "user_id",对应的 "user_name",以及每个用户最新的一条文档信息。

请注意,根据实际情况,您可能需要根据具体需求调整聚合查询中的参数和设置,如设置合适的 size 值来控制返回的聚合桶数量,以及添加其他的聚合或过滤条件等。

-------- 回复结束 --------

本着快速出活/快速解决问题的心态,ChatGPT确实提升了工作效率。不过在解决需求之后,还是要补补课,了解下ElasticSearch的用法和工作机制。因为ChatGPT是语言模型,一旦逻辑复杂起来,ChatGPT就开始瞎说了。



Tags:ElasticSearch   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Elasticsearch 性能优化详解
硬件配置优化升级硬件设备配置一直都是提高服务能力最快速有效的手段,在系统层面能够影响应用性能的一般包括三个因素:CPU、内存和 IO,可以从这三方面进行 ES 的性能优化工作。...【详细内容】
2024-03-07  Search: ElasticSearch  点击:(25)  评论:(0)  加入收藏
ElasticSearch 的概念解析与使用方式
ElasticSearch(后续简称 ES)在企业中的使用可以说是非常广泛了,那么 ES 到底是什么呢?我们学习 ES 能做到哪些事情呢?接下来我将用几篇文章详细聊一聊 ES。ES 是一款高性能的分布...【详细内容】
2023-12-29  Search: ElasticSearch  点击:(112)  评论:(0)  加入收藏
一口气看完43个关于 ElasticSearch 的实操建议
一、前言本文分享了在工作中关于 ElasticSearch 的一些使用建议。和其他更偏向手册化更注重结论的文章不同,本文将一定程度上阐述部分建议背后的原理及使用姿势参考,避免流于...【详细内容】
2023-12-28  Search: ElasticSearch  点击:(95)  评论:(0)  加入收藏
一口气看完 43 个关于 ElasticSearch 的使用建议
一、前言本文分享了在工作中关于 ElasticSearch 的一些使用建议。和其他更偏向手册化更注重结论的文章不同,本文将一定程度上阐述部分建议背后的原理及使用姿势参考,避免流于...【详细内容】
2023-12-19  Search: ElasticSearch  点击:(175)  评论:(0)  加入收藏
Elasticsearch与文件描述符的恩恩怨怨
提到Elasticsearch,让笔者最恶心的倒不是它的反人类的DSL设计,而是每次安装都需要修改进程的最大文件描述符。那ES与文件描述符有啥恩怨呢,下面就来唠叨唠叨。首先说说文件描述...【详细内容】
2023-12-13  Search: ElasticSearch  点击:(123)  评论:(0)  加入收藏
Mongodb和Elasticsearch计算经纬度哪个性能更好
MongoDB和Elasticsearch都支持计算经纬度距离,但它们的性能表现可能因使用场景和数据规模而异。性能对比1、数据索引和存储 MongoDB使用地理空间索引(2dsphere)来支持经纬度数...【详细内容】
2023-12-11  Search: ElasticSearch  点击:(213)  评论:(0)  加入收藏
SpringBoot整合ElasticSearch详解及相关使用方法
环境:springboot2.4.12 + ElasticSearch7.8.0简介Elasticsearch是一个分布式搜索引擎,底层基于Lucene实现。它屏蔽了Lucene的底层细节,提供了分布式特性,同时对外提供了Restful...【详细内容】
2023-11-10  Search: ElasticSearch  点击:(201)  评论:(0)  加入收藏
Elasticsearch的实际应用与扩展案例
当谈到搜索和分析大量数据时,Elasticsearch 是一个强大且广泛使用的工具。它是一个开源的分布式搜索和分析引擎,被设计用于处理海量数据,并提供实时的搜索、分析和可视化功能。...【详细内容】
2023-10-16  Search: ElasticSearch  点击:(269)  评论:(0)  加入收藏
十分钟掌握Doris,超越Hive、Elasticsearch和PostgreSQL
以前,数据仓库通常由Apache Hive、MySQL、Elasticsearch和PostgreSQL组成。它们支持数据仓库的数据计算和数据存储层: 数据计算:Apache Hive作为计算引擎。 数据存储:MySQL为Dat...【详细内容】
2023-09-27  Search: ElasticSearch  点击:(225)  评论:(0)  加入收藏
何时使用Elasticsearch,而不是MySQL?
MySQL 和 Elasticsearch 是两种不同的数据管理系统,它们各有优劣,适用于不同的场景。本文将从以下几个方面对它们进行比较和分析: 数据模型 查询语言 索引和搜索 分布式和高可...【详细内容】
2023-08-22  Search: ElasticSearch  点击:(195)  评论:(0)  加入收藏
▌简易百科推荐
行业大模型快速落地的一年,如何做?
生成式AI正成为时下科技企业“讲故事”的关键词之一。但从发展上看,无论是“文生文”的大语言模型,还是“文生图”的多模态模型,更多的是辅助人们进行一些简单的办公,或者提供一...【详细内容】
2024-04-10    钛媒体APP  Tags:行业大模型   点击:(3)  评论:(0)  加入收藏
互联网充斥“针对小白的AI课”,能相信吗?普通人不学AI课程会被淘汰?
早前,一位标榜清华大学博士和多家公司AI顾问名头的百万级粉丝量博主,向用户大力推介“所有人都需要学”的AI入门课程。不过,这些课程最终因贩卖焦虑、蒙骗学员而被平台下架。然...【详细内容】
2024-04-10    九派新闻  Tags:AI课   点击:(7)  评论:(0)  加入收藏
藏在AI背后的“吃电狂魔”
人工智能时代的能耗黑洞据估算,到2027年,人工智能行业每年将消耗85~134太瓦时的电力,相当于瑞典或荷兰一年的总用电量。马斯克判断,电力缺口最早可能会在2025年发生,“明年你会看...【详细内容】
2024-04-09    雪豹财经社  Tags:AI   点击:(3)  评论:(0)  加入收藏
OpenAI和谷歌再起纷争:AI的尽头是内容
日前,纽约时报的一篇报道称,人工智能公司 OpenAI为收集高质量训练数据而开发了一个语音转录模型Whisper。该模型主要用于转录 OpenAI 获取的超过 100 万小时的 YouTube 视频,也...【详细内容】
2024-04-09  小编也疯狂  新浪网  Tags:AI   点击:(3)  评论:(0)  加入收藏
AI产业的灰色暗面:OpenAI、谷歌、META如何搞训练语料
财联社4月7日讯(编辑 史正丞)种种迹象显示,目前站在全世界AI领域潮头浪尖的这些公司,早在几年前就已经陷入对训练语料的“绝望”追逐中——为此他们不惜修改政策条款...【详细内容】
2024-04-09    财联社  Tags:AI产业   点击:(4)  评论:(0)  加入收藏
和“数字人”交朋友,当心隐私被出卖......
在虚拟社交中如何在保护用户隐私和数据安全的同时提供高质量的社交体验?如何避免过度依赖虚拟社交找到虚拟与真实之间的平衡点?《中国消费者报》记者就此展开了调查APP里有个...【详细内容】
2024-04-09    中国消费者报  Tags:数字人   点击:(6)  评论:(0)  加入收藏
AI“复活”成产业链:成本可降至数百元
大模型应用落地,带火数字人(11.560, 0.29, 2.57%)赛道。文|《中国企业家》记者李艳艳 实习生 孙欣编辑|姚赟头图来源|《流浪地球2》电影画面截图清明节前,预估会有需求的庞立...【详细内容】
2024-04-09    中国企业家  Tags:AI“复活”   点击:(3)  评论:(0)  加入收藏
多方热议人工智能产业新机遇
编者按  从前沿科技展会到高层对话平台,从上海、重庆到博鳌,从线上到线下……一场场高规格、大规模的盛会中,人工智能正在成为各界热议的高频词。赋能千...【详细内容】
2024-04-08    中国家电网  Tags:人工智能   点击:(5)  评论:(0)  加入收藏
​人形机器人时代来了吗
日前,由中国人形机器人(11.080, -0.05, -0.45%)百人会主办的人形机器人大赛在北京经济技术开发区开赛。工作人员向参观者展示一款人形机器人。参观者与一款陪护型人形机器人...【详细内容】
2024-04-08    中国青年报  Tags:​人形机器人   点击:(6)  评论:(0)  加入收藏
AI重塑社交:腾讯与字节跳动的新赛场
文|新火种 一号编辑|美美最近,腾讯和字节跳动这两大互联网巨头几乎同步推出了各自的AI社交产品,尽管腾讯和字节跳动在前段时间刚刚“破冰”,但这一举措不仅意味着这两大巨头之...【详细内容】
2024-04-07    蓝鲸财经  Tags:AI   点击:(8)  评论:(0)  加入收藏
站内最新
站内热门
站内头条