目錄
場景一: 清單模糊查詢
場景二: 根據聚合結果進行過濾having
场景三: 聚合以后取topK
首頁 科技週邊 人工智慧 使用ChatGPT快速上手ElasticSearch dsl

使用ChatGPT快速上手ElasticSearch dsl

Jun 13, 2023 pm 03:20 PM
語言模型

借助ChatGPT快速上手ElasticSearch dsl

作為一個SQL玩家,接觸到ElasticSearch 以後,被其dsl奇奇怪怪的寫法所困擾,比如bool should filter 什麼場景下應該嵌套,什麼時候bool query是必須的,什麼時候可以幹掉。排查問題時,不可避免地需要手寫dsl,經常收到ES報錯。

為了解決這個問題,我嘗試讓ChatGPT幫我翻譯,效果還不錯。下面我們就按照場景來看。

場景一: 清單模糊查詢

在B端後台系統的清單頁裡,我們通常可以看到很多篩選框。產品經理經常把按 ID 和 Name 模糊匹配的功能放到一個篩選框,名曰「更好的使用者體驗」。如果用SQL寫的話,非常簡單:

select * from user where client_id = 123 anduser_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 = 123having 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就开始瞎说了。

以上是使用ChatGPT快速上手ElasticSearch dsl的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

一文搞懂Tokenization! 一文搞懂Tokenization! Apr 12, 2024 pm 02:31 PM

語言模型是對文字進行推理的,文字通常是字串形式,但模型的輸入只能是數字,因此需要將文字轉換成數字形式。 Tokenization是自然語言處理的基本任務,根據特定需求能夠把一段連續的文字序列(如句子、段落等)切分為一個字元序列(如單字、片語、字元、標點等多個單元),其中的單元稱為token或詞語。根據下圖所示的具體流程,首先將文字句子切分成一個個單元,然後將單元素數值化(映射為向量),再將這些向量輸入到模型進行編碼,最後輸出到下游任務進一步得到最終的結果。文本切分依照文本切分的粒度可以將Toke

雲端部署大模型的三個秘密 雲端部署大模型的三個秘密 Apr 24, 2024 pm 03:00 PM

編譯|星璇出品|51CTO技術堆疊(微訊號:blog51cto)在過去的兩年裡,我更參與了使用大型語言模型(LLMs)的生成AI項目,而非傳統的系統。我開始懷念無伺服器雲端運算。它們的應用範圍廣泛,從增強對話AI到為各行各業提供複雜的分析解決方案,以及其他許多功能。許多企業將這些模型部署在雲端平台上,因為公有雲供應商已經提供了現成的生態系統,而且這是阻力最小的路徑。然而,這並不便宜。雲端還提供了其他好處,如可擴展性、效率和高階運算能力(按需提供GPU)。在公有雲平台上部署LLM的過程有一些鮮為人知的

為大模型提供全新科學複雜問答基準與評估體系,UNSW、阿貢、芝加哥大學等多家機構共同推出SciQAG框架 為大模型提供全新科學複雜問答基準與評估體系,UNSW、阿貢、芝加哥大學等多家機構共同推出SciQAG框架 Jul 25, 2024 am 06:42 AM

編輯|ScienceAI問答(QA)資料集在推動自然語言處理(NLP)研究中發揮著至關重要的作用。高品質QA資料集不僅可以用於微調模型,也可以有效評估大語言模型(LLM)的能力,尤其是針對科學知識的理解和推理能力。儘管目前已有許多科學QA數據集,涵蓋了醫學、化學、生物等領域,但這些數據集仍有一些不足之處。其一,資料形式較為單一,大多數為多項選擇題(multiple-choicequestions),它們易於進行評估,但限制了模型的答案選擇範圍,無法充分測試模型的科學問題解答能力。相比之下,開放式問答

大規模語言模型高效參數微調--BitFit/Prefix/Prompt 微調系列 大規模語言模型高效參數微調--BitFit/Prefix/Prompt 微調系列 Oct 07, 2023 pm 12:13 PM

2018年Google發布了BERT,一經面世便一舉擊敗11個NLP任務的State-of-the-art(Sota)結果,成為了NLP界新的里程碑;BERT的結構如下圖所示,左邊是BERT模型預訓練過程,右邊是對於具體任務的微調過程。其中,微調階段是後續用於一些下游任務的時候進行微調,例如:文本分類,詞性標註,問答系統等,BERT無需調整結構就可以在不同的任務上進行微調。透過」預訓練語言模型+下游任務微調」的任務設計,帶來了強大的模型效果。從此,「預訓練語言模型+下游任務微調」便成為了NLP領域主流訓

RoSA: 一種高效能微調大模型參數的新方法 RoSA: 一種高效能微調大模型參數的新方法 Jan 18, 2024 pm 05:27 PM

隨著語言模型擴展到前所未有的規模,對下游任務進行全面微調變得十分昂貴。為了解決這個問題,研究人員開始注意並採用PEFT方法。 PEFT方法的主要想法是將微調的範圍限制在一小部分參數上,以降低計算成本,同時仍能實現自然語言理解任務的最先進性能。透過這種方式,研究人員能夠在保持高效能的同時,節省運算資源,為自然語言處理領域帶來新的研究熱點。 RoSA是一種新的PEFT技術,透過在一組基準測試的實驗中,發現在使用相同參數預算的情況下,RoSA表現出優於先前的低秩自適應(LoRA)和純稀疏微調方法。本文將深

Meta 推出 AI 語言模型 LLaMA,一個有著 650 億參數的大型語言模型 Meta 推出 AI 語言模型 LLaMA,一個有著 650 億參數的大型語言模型 Apr 14, 2023 pm 06:58 PM

2月25日消息,Meta在當地時間週五宣布,它將推出一種針對研究社區的基於人工智慧(AI)的新型大型語言模型,與微軟、谷歌等一眾受到ChatGPT刺激的公司一同加入人工智能競賽。 Meta的LLaMA是「大型語言模式MetaAI」(LargeLanguageModelMetaAI)的縮寫,它可以在非商業許可下提供給政府、社區和學術界的研究人員和實體工作者。該公司將提供底層程式碼供用戶使用,因此用戶可以自行調整模型,並將其用於與研究相關的用例。 Meta表示,該模型對算力的要

順手訓了一個史上超大ViT? Google升級視覺語言模型PaLI:支援100+種語言 順手訓了一個史上超大ViT? Google升級視覺語言模型PaLI:支援100+種語言 Apr 12, 2023 am 09:31 AM

近幾年自然語言處理的進展很大程度都來自於大規模語言模型,每次發布的新模型都將參數量、訓練資料量推向新高,同時也會對現有基準排行進行一次屠榜!例如今年4月,Google發布5400億參數的語言模型PaLM(Pathways Language Model)在語言和推理類的一系列測評中成功超越人類,尤其是在few-shot小樣本學習場景下的優異性能,也讓PaLM被認為是下一代語言模式的發展方向。同理,視覺語言模型其實也是大力出奇蹟,可以透過提升模型的規模來提升表現。當然了,如果只是多工的視覺語言模

BLOOM可以為人工智慧研究創造一種新的文化,但挑戰依然存在 BLOOM可以為人工智慧研究創造一種新的文化,但挑戰依然存在 Apr 09, 2023 pm 04:21 PM

譯者 | 李睿審校 | 孫淑娟BigScience研究計畫日前發布了一個大型語言模型BLOOM,乍一看,它看起來像是複製OpenAI的GPT-3的又一次嘗試。但BLOOM與其他大型自然語言模型(LLM)的不同之處在於,它在研究、開發、培訓和發布機器學習模型方面所做的努力。近年來,大型科技公司將大型自然語言模型(LLM)就像嚴守商業機密一樣隱藏起來,而BigScience團隊從專案一開始就把透明與開放放在了BLOOM的中心。其結果是一個大型語言模型,可以供研究和學習,並可供所有人使用。 B

See all articles