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.
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».
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.