2014-01-30 6 views
8

Ich verwende elasticsearch als Dokumentendatenbank und jeder Datensatz, den ich erstelle, 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/Monat erstellten Datensätze erhalten kann.Wie man einzigartige Beschränkung in der Elasticsearch Datenbank verursacht?

Was ich brauche, ist doppelte Benutzer Dateinamen zu verhindern. Gibt es eine Möglichkeit, ein indiziertes Feld so einzurichten, dass es eindeutig ist? Wie eine SQL-eindeutige Einschränkung?

+2

ich glaube, dass die einzige einzigartige constrain gilt für die '_id' Feld –

+1

Ihre Frage falsch ist, ist Elasticsearch keine Datenbasis, sondern eine Suchmaschine basierend auf Apache Lucene, das nicht solche Funktionen unterstützen. Bedenken Sie auch, dass ES "fast" in Echtzeit ist. –

Antwort

8

Sie müssten 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 derselben ID. Sie können jedoch zu op_type=create wechseln, um einen Fehler zurück zu erhalten, wenn ein Dokument mit derselben ID bereits existiert.

Es gibt keine Möglichkeit, das gleiche Verhalten mit beliebigen Feldern zu haben, nur das _id Feld funktioniert so. Ich würde wahrscheinlich in Betracht ziehen, diese Logik in der Anwendungsschicht zu handhaben, anstatt innerhalb von elasticsearch.

+0

Ich würde vorschlagen, eine separate Sammlung/Art zu haben, die einfach ein Zeiger auf das Originaldokument ist ...Auf diese Weise haben Ihre Originale immer noch die Uuid, und Sie können sogar den eindeutigen Namen als Feld im Original, der separate Typ/Dokument wird als ein eindeutiger Index für das Original fungieren. – Tracker1

2

Eine Lösung besteht darin, den Feldwert uniqueId für die Angabe der Dokument-ID zu verwenden und op_type=create zu verwenden, während die Dokumente in ES gespeichert werden. Damit können Sie sicherstellen, dass Ihr Feld uniqueId einen eindeutigen Wert hat und nicht von einem anderen gleichwertigen Dokument überschrieben wird.

Hierzu wird das Elasticsearch Dokument sagt:

Der Index Betrieb auch eine op_type akzeptiert, die verwendet werden können, um eine Operation schaffen zu erzwingen, so dass für "put-if-absent" Verhalten. 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 der op_type Parameter:

$ curl -XPUT 'http://localhost:9200/es_index/es_type/unique_a?op_type=create' -d '{ 
    "user" : "kimchy", 
    "uniqueId" : "unique_a" 
}' 

Wenn Sie die obige Anfrage laufen, es ist ok, aber es das nächste Mal ausgeführt werden Sie einen Fehler.

0

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 Ihre Dateinamen zusammen so:

<current day/month>_<auto-incremented integer> 

Auto-Inkrementierung ganze Zahlen nicht unterstützt werden durch Elasticsearch per se, aber man kann sich diese approach mit imitieren. Wenn Sie node.js verwenden, können Sie das Modul es-sequence verwenden.

1

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.

curl -XPUT localhost:9200/_river/simple_jdbc_river/_meta -d "{\"type\":\"jdbc\",\"jdbc\":{\"strategy\":\"simple\",\"poll\":\"1s\",\"driver\":\"org.postgresql.Driver\",\"url\":\"jdbc:postgresql://DB-URL/DB-INSTANCE\",\"user\":\"USERNAME\",\"password\":\"PASSWORD\",\"sql\":\"select t.id as _id,t.name from topic as t \",\"digesting\" : true},\"index\":{\"index\":\"jdbc\",\"type\":\"topic_jdbc_river1\"}}" 
Verwandte Themen