2016-01-03 17 views
16

Używam Elasticsearch Bulk API do tworzenia lub aktualizowania dokumentów.Elasticsearch Bulk API - Indeks vs Utwórz/zaktualizuj

W rzeczywistości wiem, czy są tworzone lub aktualizacje, ale mogę uprościć mój kod, po prostu robiąc je wszystkie index, lub "upserts" w sensie SQL.

Czy jest jakaś wada w korzystaniu z index (i pozwalanie ES-go to rozgryźć) na używanie bardziej jednoznacznych create i update?

Odpowiedz

23

Jeśli wysyłasz create, należy upewnić się, że dokument nie istnieje jeszcze w indeksie inaczej połączenie nie powiedzie się, podczas wysyłania tego samego dokumentu z index zawsze uda.

Następnie, jeżeli ze względu na wydajność, wiesz, musisz utworzyć dokument (z obu create lub index) i wtedy będziesz aktualizować jedynie tylko kilka właściwości, a następnie za pomocą update może mieć sens.

W przeciwnym razie, jeśli zawsze wysyłasz pełne dokumenty, cały czas używałbym index, zarówno do tworzenia, jak i aktualizowania. Ilekroć dojdzie do akcji index, ES albo utworzy dokument, jeśli nie istnieje, albo zastąpi go, jeśli istnieje, ale połączenie zawsze się powiedzie.

2

Nie będzie można użyć indeksu do wszystkiego. Według docs:

indeks będzie dodać lub wymienić dokument jako niezbędny

Ponadto, jeśli są aktualizacją dokumentu, może warto byłoby dodać flagę „doc_as_upsert”. Więcej informacji here i here

5

Krótka odpowiedź: Nie, nie ma żadnych wad.

Utworzenie i aktualizacja punktu końcowego są przypadkami specjalnymi. Przy tworzeniu nie chcesz nic robić, jeśli dokument już tam jest. Dzięki aktualizacji możesz podać mniej danych, jeśli nie masz wszystkich danych dokumentu, możesz dodać kilka pól. Możesz także upewnić się, że dokument jest indeksowany tylko w przypadku, gdy jest już dostępny wraz z aktualizacją.

+0

Załóżmy, że możesz potencjalnie zamienić dany dokument wiele, wiele razy (np. Wielokrotnie indeksując ten sam dokument). Skoro ES tak naprawdę niczego nie "usuwa", to czy nie dodajesz coraz więcej dokumentów i nie zwiększasz ich numeru wersji, pozostawiając je później w garbage collectorze, aby oczyścić starsze wersje? Czy w takim przypadku nie korzystasz z indeksu zamiast tworzyć w najbliższym czasie indeksu, który może wpłynąć na wydajność? I czy przyszłe intensywne korzystanie z funkcji zbierania śmieci również nie wpłynie na wydajność? To jest prawdziwe pytanie, które zastanawiam się, a nie retoryczne. Dzięki – cwarny

+0

Ale kiedy aktualizujesz dokument, czy to nie jest pobieranie, modyfikowanie, a następnie indeksowanie? W Aktualizowaniu całego dokumentu stwierdziliśmy, że sposobem aktualizacji dokumentu jest jego odzyskanie, zmiana, a następnie ponowne zindeksowanie całego dokumentu. To prawda. Jednak za pomocą interfejsu API aktualizacji możemy wprowadzać częściowe aktualizacje, takie jak zwiększanie licznika w jednym żądaniu. Powiedzieliśmy również, że dokumenty są niezmienne: nie można ich zmienić, a jedynie wymienić. Interfejs API aktualizacji musi być zgodny z tymi samymi regułami. –