Maison  >  Article  >  Périphériques technologiques  >  Démarrez rapidement avec ElasticSearch DSL avec ChatGPT

Démarrez rapidement avec ElasticSearch DSL avec ChatGPT

WBOY
WBOYavant
2023-06-13 15:20:51767parcourir

借助ChatGPT快速上手ElasticSearch dsl

En tant que joueur SQL, après être entré en contact avec ElasticSearch, j'ai été troublé par les étranges méthodes d'écriture de son DSL, par exemple dans quels scénarios bool devrait filtrer doit être imbriqué, quand une requête bool est nécessaire et quand peut-on il soit éliminé. Lors du dépannage de problèmes, il est inévitable d'écrire DSL à la main et de recevoir souvent des erreurs ES.

Afin de résoudre ce problème, j'ai essayé de laisser ChatGPT traduire pour moi, et l'effet a été plutôt bon. Regardons cela selon le scénario.

Scénario 1 : Liste de requêtes floues

Dans la page de liste du système backend côté B, nous pouvons généralement voir de nombreuses boîtes de filtres. Les chefs de produit placent souvent la fonction de correspondance floue par ID et nom dans une boîte de filtre appelée « meilleure expérience utilisateur ». S'il est écrit en SQL, c'est très simple :

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

S'il est stocké dans MySQL, l'ajout de l'index client_id peut réduire considérablement la quantité de données filtrées, et les performances ne seront pas trop mauvaises.

Si la quantité de données est très importante, utilisez ES. On peut demander à ChatGPT comme ceci :

Commencez la question :

ES index name "user", il y a trois champs

  1. user_id string
  2. user_name string
  3. client_id in t

Je souhaite interroger les enregistrements avec les conditions suivantes : client_id = 123 et (user_name = 'Zhang San' ou user_id = 'Zhang San'). Comment dois-je écrire DSL ?

Début de réponse :

Pour interroger les enregistrements de l'index "user" qui remplissent les conditions suivantes : client_id = 123 et (user_name = 'Zhang San' ou user_id = 'Zhang San'), vous pouvez utilisez une requête booléenne combinée avec le terme Requête pour y parvenir. Voici un exemple de requête DSL correspondante :

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

Dans cette requête, nous utilisons une requête booléenne pour garantir que les critères spécifiés sont utilisés pour filtrer les documents.

Dans la clause de filtrage, nous avons deux conditions : l'une est pour la condition que la valeur du champ "client_id" soit 123, en utilisant le terme requête. La deuxième condition est une requête booléenne imbriquée qui contient une clause Should. La clause Should contient deux requêtes de termes : une pour le champ "user_name" et l'autre pour le champ "user_id", qui vérifient toutes deux si la valeur est "Zhang San". En utilisant la clause Should, nous indiquons que l’une des conditions doit correspondre.

Cette requête DSL renverra les enregistrements de documents dont l'ID client est 123 et le nom d'utilisateur est "Zhang San" ou l'ID utilisateur est "Zhang San".

Fin de la réponse :

ChatGPT a non seulement donné la réponse, mais a également donné une explication. On peut juste apporter quelques modifications à l'index dans l'entreprise.

Scénario 2 : Filtrage basé sur les résultats d'agrégation ayant

Sur la base du tableau utilisateur ci-dessus, nous ajoutons un champ ticket_id pour représenter les bons de travail traités. Nous voulons connaître les utilisateurs qui ont traité plus de 100 bons de travail. SQL peut être écrit comme ceci :

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;

Demandez à ChatGPT :

Commencez à demander :

Nom d'index ES "user", contenant les champs suivants :

  1. user_id string
  2. user_ nom string
  3. client_id int
  4. ticket_id

Agrégation selon user_id, interrogez l'user_id de count(ticket_id) > 100, et le nom d'utilisateur correspondant à l'user_id La réponse commence : "user_id". champ L'agrégation et l'interrogation de "user_id" qui remplit la condition count(ticket_id) > 100, et le "user_name" correspondant peuvent être implémentées à l'aide des termes agrégation et bucket_selector pipeline agrégation dans la requête d'agrégation. Voici l'exemple de requête DSL correspondant :

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就开始瞎说了。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer