Ich verwende elasticsearch als Dokumentendatenbank und jeder von mir erstellte Datensatz hat eine GUID-ID, die das System für die Datensatz-ID verwendet. Geschäftsleute möchten eine Funktion anbieten, mit der der Benutzer seine eigene automatische Dateinamenskonvention basierend auf dem Datum und der Anzahl der bisher an diesem Tag / im Monat erstellten Datensätze erhalten kann.
Was ich brauche, ist, doppelte Dateinamen von Benutzern zu verhindern. Gibt es eine Möglichkeit, ein indiziertes Feld so einzurichten, dass es eindeutig ist? Wie eine eindeutige SQL-Einschränkung?
Sie müssen das Feld verwenden, das als ID für Ihre Dokumente eindeutig sein soll. Standardmäßig überschreibt ein neues Dokument mit einer vorhandenen ID das vorhandene Dokument mit der gleichen ID. Sie können jedoch zu op_type=create
wechseln, um einen Fehler zu erhalten, wenn ein Dokument mit derselben ID bereits existiert.
Es gibt keine Möglichkeit, das gleiche Verhalten mit beliebigen Feldern zu haben, nur die _id
Feld funktioniert so. Ich würde wahrscheinlich in Betracht ziehen, diese Logik in der Anwendungsschicht zu handhaben, anstatt innerhalb von elasticsearch.
Eine Lösung besteht darin, den uniqueId
-Feldwert für die Angabe der Dokument-ID zu verwenden und op_type=create
beim Speichern der Dokumente in ES zu verwenden. Damit können Sie sicherstellen, dass Ihr uniqueId
-Feld einen eindeutigen Wert hat und nicht von einem anderen gleichwertigen Dokument überschrieben wird.
Dazu sagt das elasticsearch-Dokument:
Die Indexoperation akzeptiert auch einen op_type, der verwendet werden kann, um eine Erstellungsoperation zu erzwingen, die das Verhalten "put-if-abwesend" ermöglicht. Wenn create verwendet wird, schlägt die Indexoperation fehl, wenn ein Dokument dieser ID bereits im Index vorhanden ist.
Hier ist ein Beispiel für die Verwendung des Parameters op_type:
%Vor%Wenn Sie die obige Anfrage ausführen, ist es in Ordnung, aber wenn Sie das nächste Mal ausführen, erhalten Sie einen Fehler.
Sie können die _id in der Spalte verwenden, für die Sie eine eindeutige Einschränkung haben möchten. Hier ist der Beispielfluss, der postgresql verwendet. Sie können den Datenbanktreiber / DB-URL entsprechend Ihrer Verwendung ändern.
%Vor%Ein anderer Ansatz könnte darin bestehen, die Zeichenkette zu generieren, die Sie in einem Feld speichern, das eindeutig sein sollte, indem Sie eine automatisch inkrementierende Ganzzahl integrieren. Auf diese Weise stellen Sie von Anfang an sicher, dass Ihre Feldwerte eindeutig sind.
Sie würden Ihren Dateinamen wie folgt zusammenstellen:
%Vor%Automatisch inkrementierende Ganzzahlen werden von Elasticsearch per se nicht unterstützt, aber Sie könnten sie anhand dieser Ansatz . Wenn Sie node.js verwenden, können Sie das Modul es-sequence verwenden.
Tags und Links elasticsearch