[PYTHON] [AWS] Comment gérer l'erreur "Point de code non valide" dans CloudSearch

Cet article résume comment traiter l'erreur «codepoin xx non valide» dans [AWS] CloudSearch. J'ai écrit le code en Python, mais je pense que les points sont les mêmes pour tous les langages.

[Ajouté le 22/09/2020] La fonction introduite ici qui supprime les caractères que CloudSearch renvoie une erreur peut avoir des caractères supprimés qui n'ont pas besoin d'être supprimés. Nous vérifierons et mettrons à jour cet article à une date ultérieure.

Qu'est-ce qu'une erreur "Point de code xx non valide"?

Se produit lorsque vous définissez un type de texte ou de tableau de texte dans le champ d'index d'un domaine de recherche CloudSearch et que vous essayez de télécharger des caractères que le champ ne peut pas accepter. Par exemple, si un champ de type texte appelé titre contient un caractère de remplacement (SUB), le message d'erreur suivant sera renvoyé.

Validation error for field 'title': Invalid codepoint 1A

1A est un type de caractère de contrôle appelé caractère de remplacement, qui est un point de code non valide pour les champs de type texte. J'ai rencontré cette erreur car les données avec lesquelles je travaillais contenaient des caractères de point de code tels que «1A» et «08».

Méthode de réponse simple

Voici une fonction qui supprime les caractères illégaux.

def remove_invalid_code2(text: str) -> str:
    RE_ILLEGAL = u"[^\u0009\u000a\u000d\u0020-\uD7FF\uE000-\uFFFD]"
    return re.sub(RE_ILLEGAL, "", text)

Pour les chaînes de champs saisis sous forme de texte, tableau de texte, utilisez cette fonction pour supprimer les caractères non autorisés.

Le fait est que ** j'appliquerai la fonction à chaque chaîne de caractères **. Ne pensez pas: "Si vous sérialisez avec json.dumps, vous pouvez supprimer le code de caractère illégal d'un seul coup." Vous aurez un sentiment amer.

Vous trouverez ci-dessous un exemple de code pour télécharger des données de classe utilisateur dans le domaine de recherche. J'adore les types, donc je code tout en vérifiant les types avec mypy.

import json
import re
from dataclasses import asdict, dataclass
from typing import Any, ClassVar, Dict, List, Literal, TypedDict
from uuid import uuid4

import boto3
from mypy_boto3_cloudsearchdomain import CloudSearchDomainClient

def remove_invalid_code(text: str) -> str:
    RE_ILLEGAL = u"[^\u0009\u000a\u000d\u0020-\uD7FF\uE000-\uFFFD]"
    return re.sub(RE_ILLEGAL, "", text)


class AddBatchItem(TypedDict):
    type: Literal["add"]
    id: str
    fields: Dict[str, Any]


class DeleteBatchItem(TypedDict):
    type: Literal["delete"]
    id: str


BatchItem = Union[AddBatchItem, DeleteBatchItem]
Type = Literal["add", "delete"]


@dataclass
class User:
    id: str
    name: str
    age: int
    short_description: str
    description: str

    _text_fields: ClassVar[List[str]] = ["short_description", "description"]

    def get_batch_item(self, operation_type: Type) -> BatchItem:
        if operation_type == "delete":
            return {"id": self.id, "type": "delete"}

        fields = asdict(self)
        del fields["id"]

        #Point: appliquez la fonction à chaque valeur! !!
        fields = {
            k: remove_invalid_code(v) if k in self._text_fields else v
            for k, v in fields.items()
        }

        return {"id": self.id, "type": "add", "fields": fields}


if __name__ == "__main__":

    SEARCH_ENDPOINT = "http://xxxx.com"
    client: CloudSearchDomainClient = boto3.client(
        "cloudsearchdomain", endpoint_url=SEARCH_ENDPOINT
    )

    user = User(
        id=str(uuid4()),
        name="John",
        age=18,
        short_description="Je vais bien",
        description="Je vais bien! !!" + u"\b" + "Ravi de vous rencontrer!",
    )

    batch_items = [user.get_batch_item("add")]
    docs = json.dumps(batch_items).encode("utf-8")
    client.upload_documents(documents=docs, contentType="application/json")

C'est tout pour cet article.

J'ai eu du mal à trouver la solution simple que j'ai présentée ici. J'ai l'intention d'écrire un autre article sur ce que j'en ai appris.

Maintenant je peux écrire "... une sorte de caractère de contrôle ... un point de code (enfin, vous savez?)", Mais quand j'ai rencontré une erreur, je n'étais pas familier avec le code de caractère, donc j'ai eu beaucoup de problèmes avec le débogage. fait. Si vous êtes ravi d'une compréhension vague de ce domaine, veuillez lire l'article suivant. impatient de.

Recommended Posts

[AWS] Comment gérer l'erreur "Point de code non valide" dans CloudSearch
Comment gérer l'erreur d'installation de python dans pyenv (BUILD FAILED)
Comment gérer les fuites de mémoire dans matplotlib.pyplot
Comment gérer les erreurs d'exécution dans subprocess.call
[AWS] Comment gérer WordPress "Une erreur s'est produite lors du recadrage d'une image."
Comment gérer l'échec de l'initialisation pyenv dans Fish 3.1.0
Comment gérer l'exécution de la transaction: échec dans Anaconda
Comment traiter l'erreur "Aucun module nommé" "" dans Jupyter Notebook | Installer avec! Pip!
Comment gérer les données déséquilibrées
Comment gérer l'erreur DistributionNotFound
Pour les débutants, comment gérer les erreurs courantes dans les keras
Comment supprimer l'erreur d'affichage dans matplotlib
Comment utiliser BigQuery en Python
Comment gérer les erreurs de compatibilité d'énumération
Comment gérer l'erreur OAuth2 lors de l'utilisation des API Google à partir de Python
Comment gérer l'erreur SSL lors de la connexion à S3 avec Python boto
Comment gérer les caractères déformés dans json de Django REST Framework
Que faire lorsque la version Python est ancienne dans Cloud 9 créée par une autre personne
Comment gérer les erreurs en frappant pip ②
[REAPER] Comment jouer à Reascript avec Python
ne peut pas décaper. Comment gérer les objets Annoy
Comment gérer le module 'Sensorflow' n'a aucun attribut '
Connectez-vous facilement à AWS avec plusieurs comptes
Comment utiliser tkinter avec python dans pyenv
[AWS] Comment gérer Wordpress "La réponse n'est pas la bonne réponse JSON"
Comment convertir / restaurer une chaîne avec [] en python
Expliquez en détail comment créer un son avec python
La solution de contournement pour le modèle de Django n'existe pas
Comment faire du zéro-padding sur une ligne avec OpenCV
Comment exécuter des tests avec Python unittest
Comment charger des fichiers dans Google Drive avec Google Colaboratory
Comment accéder avec cache lors de la lecture_json avec pandas
Comment installer la poésie (gestion des erreurs) dans l'environnement zsh
Comment traiter l'erreur "Erreur de type: Aucune signature correspondante trouvée" lors de l'utilisation de pandas fillna
Comment extraire n'importe quel rendez-vous dans Google Agenda avec Python
Comment vérifier le comportement d'ORM avec un fichier avec django
Comment manipuler le DOM dans iframe avec Selenium
Comment lancer avec Theano
Une histoire sur la façon de traiter le problème CORS
Comment modifier avec SQLAlchemy?
Comment gérer l'erreur selon laquelle le conteneur MySQL de Docker ne démarre pas sur Docker Toolbox
Comment séparer les chaînes avec ','
Comment faire RDP sur Fedora31
Comment développer en Python
Comment créer une trame de données et jouer avec des éléments avec des pandas
Comment gérer UnicodeDecodeError lors de l'exécution du téléchargement d'image Google
2 façons de gérer SessionNotCreatedException
Comment supprimer avec SQLAlchemy?
Comment se connecter à AtCoder avec Python et soumettre automatiquement
[VLC] Comment gérer le problème de ne pas être au premier plan pendant la lecture
Comment traiter l'erreur "Impossible de charger le module" canberra-gtk-module "qui apparaît lorsque vous exécutez OpenCV
Comment ne pas échapper au japonais en traitant avec JSON en Python
Comment gérer "Vous avez plusieurs backends d'authentification configurés ..." (Django)
Pour utiliser python, mettez pyenv sur macOS avec PyCall
Comment installer des pandas sur EC2 (Comment gérer MemoryError et PermissionError)