Elastyczne wyszukiwanie, wiele indeksów czy jeden indeks i typy dla różnych zestawów danych?

161

Mam aplikację opracowaną przy użyciu wzorca MVC i chciałbym teraz zindeksować wiele jej modeli, co oznacza, że ​​każdy model ma inną strukturę danych.

  • Czy lepiej jest używać wielu indeksów, po jednym dla każdego modelu, czy mieć typ w tym samym indeksie dla każdego modelu? Myślę, że oba sposoby wymagałyby również innego zapytania wyszukiwania. Dopiero co zacząłem.

  • Czy istnieją różnice w wydajności obu koncepcji, jeśli zbiór danych jest mały lub ogromny?

Drugie pytanie przetestowałbym sam, gdyby ktoś polecił mi jakieś dobre przykładowe dane do tego celu.

burzum
źródło

Odpowiedzi:

184

Oba podejścia mają różne konsekwencje.

Zakładając, że używasz domyślnych ustawień Elasticsearch, posiadanie 1 indeksu dla każdego modelu znacznie zwiększy liczbę twoich shardów, ponieważ 1 indeks użyje 5 shardów, 5 modeli danych użyje 25 shardów; mając 5 typów obiektów w 1 indeksie nadal będzie używać 5 shardów.

Konsekwencje posiadania każdego modelu danych jako indeksu:

  • Wydajne i szybkie wyszukiwanie w indeksie, ponieważ ilość danych powinna być mniejsza w każdym fragmencie, ponieważ są one dystrybuowane do różnych indeksów.
  • Przeszukiwanie kombinacji modeli danych z 2 lub więcej indeksów będzie generować narzut, ponieważ zapytanie będzie musiało zostać wysłane do większej liczby fragmentów w indeksach, skompilowane i odesłane do użytkownika.
  • Niezalecane, jeśli zestaw danych jest mały, ponieważ przy każdym utworzeniu każdego dodatkowego fragmentu będzie więcej miejsca do magazynowania, a wzrost wydajności jest marginalny.
  • Zalecane, jeśli zestaw danych jest duży, a przetwarzanie zapytań zajmuje dużo czasu, ponieważ dedykowane fragmenty przechowują określone dane i Elasticsearch będzie łatwiej je przetwarzać.

Konsekwencje posiadania każdego modelu danych jako typu obiektu w indeksie:

  • Więcej danych będzie przechowywanych w 5 fragmentach indeksu, co oznacza, że ​​podczas wykonywania zapytań dotyczących różnych modeli danych występują mniejsze problemy, ale rozmiar fragmentu będzie znacznie większy.
  • Więcej danych we fragmentach zajmie więcej czasu, zanim Elasticsearch przeszuka, ponieważ jest więcej dokumentów do filtrowania.
  • Niezalecane, jeśli wiesz, że przechodzisz przez 1 terabajty danych i nie dystrybuujesz swoich danych między różnymi indeksami lub wieloma fragmentami w mapowaniu Elasticsearch.
  • Zalecane w przypadku małych zestawów danych, ponieważ nie marnujesz miejsca w pamięci w celu uzyskania marginalnego wzrostu wydajności, ponieważ każdy fragment zajmuje miejsce w sprzęcie.

Jeśli pytasz, co to jest za dużo danych, a co za małe? Zwykle zależy to od szybkości procesora i pamięci RAM sprzętu, ilości danych przechowywanych w każdej zmiennej w mapowaniu dla Elasticsearch oraz wymagań dotyczących zapytań; używanie wielu aspektów w zapytaniach znacznie spowolni czas odpowiedzi. Nie ma prostej odpowiedzi na to pytanie i będziesz musiał wykonać test porównawczy zgodnie ze swoimi potrzebami.

Jonathan Moo
źródło
8
Ta odpowiedź nie jest kompletna bez informacji z elasticsearch.org/guide/en/elasticsearch/guide/current/...
AndreKR
5
Aby dodać do doskonałej odpowiedzi, cytuję z dokumentu ES 5.2, który wyjaśnia, dlaczego przechowywanie dużej liczby fragmentów nie jest zalecane: „ By default elasticsearch rejects search requests that would query more than 1000 shards. The reason is that such large numbers of shards make the job of the coordinating node very CPU and memory intensive. It is usually a better idea to organize data in such a way that there are fewer larger shards. In case you would like to bypass this limit, which is discouraged, you can update the action.search.shard_count.limit cluster setting to a greater value.
zapomnienie
49

Chociaż odpowiedź Jonathana była wtedy poprawna, świat się zmienił i wydaje się, że ludzie stojący za ElasticSearch mają długoterminowy plan rezygnacji z obsługi wielu typów:

Gdzie chcemy się dostać: Chcemy usunąć koncepcję typów z Elasticsearch, jednocześnie wspierając rodzica / dziecko.

Tak więc w przypadku nowych projektów użycie tylko jednego typu na indeks ułatwi ewentualną aktualizację do ElasticSearch 6.x.

Danack
źródło
13

Odpowiedź Jonathana jest świetna. Chciałbym tylko dodać kilka innych punktów do rozważenia:

  • liczbę fragmentów można dostosować do wybranego rozwiązania. Możesz mieć jeden indeks z 15 podstawowymi fragmentami lub podzielić go na 3 indeksy dla 5 fragmentów - perspektywa wydajności nie ulegnie zmianie (zakładając, że dane są rozmieszczone równomiernie)
  • pomyśl o wykorzystaniu danych. To znaczy. jeśli używasz kibana do wizualizacji, łatwiej jest uwzględnić / wykluczyć określone indeksy, ale typy muszą być filtrowane na pulpicie nawigacyjnym
  • przechowywanie danych: w przypadku danych dziennika / metryk aplikacji użyj różnych indeksów, jeśli potrzebujesz innego okresu przechowywania
Marcel Matus
źródło
Co oznacza okres przechowywania? Czy odnosisz się do czasu życia w polu? Jest to ustalane dla każdego dokumentu.
Kshitiz Sharma,
Nie, tutaj okres przechowywania oznacza przechowywanie dokumentów / indeksów - jak długo mają być przechowywane te dane. Na podstawie jakości, rozmiaru i ważności danych - używam do określenia różnych zasad przechowywania. Niektóre dane / indeksy są usuwane po 7 dniach, inne po 6 tyg., A niektóre po 10 latach ...
Marcel Matus
2

Obie powyższe odpowiedzi są świetne!

Dodaję przykład kilku typów w indeksie. Załóżmy, że tworzysz aplikację do wyszukiwania książek w bibliotece. Jest kilka pytań do właściciela Biblioteki,

Pytania:

  1. Ile książek planujesz przechowywać?

  2. Jakie książki zamierzasz przechowywać w bibliotece?

  3. Jak zamierzasz szukać książek?

Odpowiedzi:

  1. Planuję przechowywać od 50 tys. Do 70 tys. Książek (w przybliżeniu)

  2. Będę mieć 15 tys. -20 tys. Książek związanych z technologią (informatyka, inżynieria mechaniczna, inżynieria chemiczna itd.), 15 tys. Książek historycznych, 10 tys. Medycznych. 10 tys. Książek związanych z językiem (angielski, hiszpański itd.)

  3. Szukaj według imienia autora, nazwiska autora, roku wydania, nazwy wydawcy. (To daje wyobrażenie o tym, jakie informacje należy przechowywać w indeksie)

Z powyższych odpowiedzi możemy powiedzieć, że schemat w naszym indeksie powinien wyglądać mniej więcej tak.

// To nie jest dokładne mapowanie, tylko na przykład

            "yearOfPublish":{
                "type": "integer"
            },
            "author":{
                "type": "object",
                "properties": {
                    "firstName":{
                        "type": "string"
                    },
                    "lastName":{
                        "type": "string"
                    }
                }
            },
            "publisherName":{
                "type": "string"
            }
        }

Aby to osiągnąć, możemy stworzyć jeden indeks o nazwie Książki i może on mieć różne typy.

Indeks: książka

Rodzaje: nauka, sztuka

(Lub możesz utworzyć wiele typów, takich jak technologia, nauki medyczne, historia, język, jeśli masz dużo więcej książek)

Należy tutaj pamiętać, że schemat jest podobny, ale dane nie są identyczne. Inną ważną rzeczą jest całkowita ilość przechowywanych danych.

Mam nadzieję, że powyższe pomoże, kiedy wybrać różne typy w indeksie, jeśli masz inny schemat, powinieneś rozważyć inny indeks. Mały indeks dla mniejszej ilości danych. duży indeks dużych zbiorów danych :-)

Sourav
źródło