2017-08-30 6 views
2

Ich habe einen Dienst, der Dokumente indiziert. Der Dienst empfängt zwei folgende Anforderungen - die erste ist ein Dokument einzufügen und die zweite, um es zu löschen. Wenn zwischen ihnen etwas Zeit ist, funktioniert es gut, aber wenn sie nacheinander gesendet werden, wird das Dokument nicht gelöscht. Die Antwort, die ich von Nest bekomme, sieht erfolgreich aus.Dokument wird nicht gelöscht, wenn die Löschanforderung unmittelbar nach dem Einfügeauftrag gesendet wurde

Meine Funktion ist Arten lang, also schreibe ich nur die Einfügung und lösche innen. Wenn mehr Informationen benötigt werden, werde ich sie hinzufügen (zum Beispiel im Falle der Einfügung in löscht es auch von allen anderen verfügbaren Indizes und fügt bei Bedarf ein Mapping ein).

Insert Code:

IBulkResponse res = await _client.IndexManyAsync(entities, index, type); 

löscht Code:

var termFilter = new List<Func<QueryContainerDescriptor<JObject>, QueryContainer>> 
     { 
      c => c.Terms(t => t.Field(ID_FIELD).Terms(ids)) 
     }; 

     await _client.DeleteByQueryAsync<JObject>(indices, types, d => d.Query(q => q.Bool(b => b.Must(termFilter)))); 

Zum Beispiel dieses Integrationstest nicht funktioniert:

var indices = new { "some_index_1", "some_index_2" }; 
var entity = new Entity { Action = ReplicationAction.INSERT, ... }; 
await elasticDal.Insert(new List { entity }, "some_index_1", "666", indices); 
entity.Action = ReplicationAction.DELETE; 
await elasticDal.Insert(new List { entity }, "some_index_1", "666", indices); 

Versionen: Elasticsearch 2.3.5. Net 4.6, Nest 2.4.6

Antwort

0

Beim Einfügen eines Dokuments treten folgende Schritte auf:

  1. Dokument wird zum Speicherpuffer hinzugefügt und an den Translog angehängt.
  2. Aktualisieren Die Dokumente im In-Memory-Puffer werden in ein neues Segment geschrieben, ohne ein fsync.

    a. Das Segment wird geöffnet, um es für die Suche sichtbar zu machen.

    b. Der speicherinterne Puffer wird gelöscht.

  3. Das Segment wird geöffnet, um es für die Suche sichtbar zu machen.

  4. Jedes Mal, wenn der Translog zu groß wird, wird der Index gelöscht; ein neues Translog wird erstellt und ein vollständiges Festschreiben ausgeführt:

    a. Alle Dokumente im In-Memory-Puffer werden in ein neues Segment geschrieben.

    b. Der Puffer ist gelöscht.

    c. Ein Festschreibungspunkt wird auf die Festplatte geschrieben.

    d. Der Dateisystemcache wird mit einem fsync geleert.

    e. Das alte Translog wird gelöscht.

Elasticsearch das Dokument nicht löschen, Dokument als gelöschtes Dokument markieren und während der Zusammenführung der Indexsegmente ES Blätter Dokument, wenn es in dem Speicher gelöscht.

Also meine Vermutung ist, dass Sie die Aktualisierungs-API nach dem Löschen fehlt. Wenn Ihre DELETE-API nicht so häufig ist, können Sie Ihre ES nach dem Aufrufen der DELETE-API durch Aufrufen der REFRESH-API aktualisieren.

Wenn Sie mehr darüber zu erfahren, wie die Indizierung hinter dem Bild ist happing Sie diesen Link verweisen (https://www.elastic.co/guide/en/elasticsearch/guide/current/translog.html)

+0

die Löschungen in diesem Fall recht häufig sind. und es gibt andere Fälle, in denen ich viele Dokumente auf einmal löschen muss. sollte ich noch die refresh api verwenden? Wenn nicht, was kann ich noch tun? – Mei

+0

Ich habe gerade versucht, die Aktualisierung API (erwarten _client.RefreshAsync (neue RefreshRequest (Indizes))), aber es tut Hilfe – Mei

+0

ES aktualisieren jede Sekunde. Also können Sie einen Schlaf für sagen wir Ihnen zwei Sekunden und wenn Ihre Häufigkeit weniger als ein Dokument pro Sekunde ist, können Sie aktualisieren. Aber mein Vorschlag ist Schlaf von einer Sekunde. –

Verwandte Themen