Dieser Artikel fasst zusammen, wie mit dem Fehler "Ungültiger Codepoin xx" in [AWS] CloudSearch umgegangen wird. Ich habe den Code in Python geschrieben, aber ich denke, die Punkte sind für alle Sprachen gleich.
[Hinzugefügt am 22.09.2020] Die hier eingeführte Funktion zum Löschen von Zeichen, bei denen CloudSearch einen Fehler zurückgibt, hat möglicherweise Zeichen gelöscht, die nicht gelöscht werden müssen. Wir werden diesen Artikel zu einem späteren Zeitpunkt überprüfen und aktualisieren.
Tritt auf, wenn Sie einen Text oder einen Textarray-Typ im Indexfeld einer CloudSearch-Suchdomäne festlegen und versuchen, Zeichen hochzuladen, die das Feld nicht akzeptieren kann. Wenn beispielsweise ein Texttypfeld mit dem Namen title ein Ersatzzeichen (SUB) enthält, wird die folgende Fehlermeldung zurückgegeben.
Validation error for field 'title': Invalid codepoint 1A
1A ist eine Art Steuerzeichen, das als Ersatzzeichen bezeichnet wird und ein ungültiger Codepunkt für Texttypfelder ist. Ich bin auf diesen Fehler gestoßen, weil die Daten, mit denen ich zu tun hatte, Codepunktzeichen wie "1A" und "08" enthielten.
Hier ist eine Funktion, die unzulässige Zeichen entfernt.
def remove_invalid_code2(text: str) -> str:
RE_ILLEGAL = u"[^\u0009\u000a\u000d\u0020-\uD7FF\uE000-\uFFFD]"
return re.sub(RE_ILLEGAL, "", text)
Verwenden Sie für Zeichenfolgen in Feldern, die als Text oder Textarray eingegeben wurden, diese Funktion, um unzulässige Zeichen zu entfernen.
Der Punkt ist, dass ** ich die Funktion auf jede Zeichenfolge anwenden werde **. Denken Sie nicht: "Wenn Sie mit" json.dumps "serialisieren, können Sie den illegalen Zeichencode auf einmal entfernen." Sie werden ein bitteres Gefühl haben.
Unten finden Sie einen Beispielcode zum Hochladen von Benutzerklassendaten in die Suchdomäne. Ich liebe Typen, also codiere ich, während ich Typen mit mypy überprüfe.
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"]
#Punkt: Wenden Sie die Funktion auf jeden Wert an! !!
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="es geht mir gut",
description="Es geht mir gut! !!" + u"\b" + "Freut mich, dich kennenzulernen!",
)
batch_items = [user.get_batch_item("add")]
docs = json.dumps(batch_items).encode("utf-8")
client.upload_documents(documents=docs, contentType="application/json")
Das ist alles für diesen Artikel.
Es fiel mir schwer, zu der einfachen Lösung zu gelangen, die ich hier vorgestellt habe. Ich habe vor, einen weiteren Artikel darüber zu schreiben, was ich daraus gelernt habe.
Jetzt kann ich "... eine Art Steuerzeichen ... einen Codepunkt (na ja, wissen Sie?)" Schreiben. Als ich jedoch auf einen Fehler stieß, war ich mit dem Zeichencode nicht vertraut, sodass ich beim Debuggen große Probleme hatte. tat. Wenn Sie von einem vagen Verständnis dieses Bereichs begeistert sind, lesen Sie bitte den nächsten Artikel. Ich freue mich darauf.