使用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",有三個欄位
- #user_id string
- user_name string
- 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",包含以下欄位:
- user_id string
- user_name string
- #client_id int
- 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",包含以下字段:
- user_id string
- user_name string
- client_id int
- 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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

熱門話題

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

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

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

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

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

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

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

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