2015-02-03 10 views
6

Czy istnieje sposób na zwiększenie wydajności pamięci podczas korzystania z indeksu perkolatora elasticsearch?Jak zoptymalizować indeks perkolatora elastycznego Wydajność pamięci

Utworzono osobny indeks dla mojego perkolatora. Mam około 1 000 000 utworzonych przez użytkownika zapisanych wyszukiwań (w przypadku powiadomień e-mail). Po utworzeniu indeksu perkolatorów, wykorzystanie mojego sterty wzrosło do 100%, a serwer przestał odpowiadać na wszelkie zapytania. Mam nieco ograniczone zasoby i nie jestem w stanie po prostu rzucić więcej pamięci RAM na problem. Jedynym rozwiązaniem było usunięcie indeksu zawierającego moje zapisane wyszukiwania.

Z tego, co przeczytałem, indeks perkolatora znajduje się w pamięci na stałe. Czy to jest absolutnie konieczne? Czy istnieje sposób na dławienie tego zachowania, ale nadal zachowują funkcjonalność? Czy istnieje sposób na optymalizację mojej struktury danych/zapytań/indeksu w celu obejścia tego zachowania przy jednoczesnym osiągnięciu pożądanego rezultatu?

+0

Ile pamięci przydzieliłeś swojemu serwerowi ElasticSearch? –

+0

@DennisGorelik Mam 3 węzły, każdy z 16 GB i 8 GB alokacji sterty. – richardpj

Odpowiedz

0

Nie ma rozwiązania tego problemu z punktu widzenia ElasticSearch, ani nie jest prawdopodobne. Rozmawiałem bezpośrednio z członkami ElasticSearch, a ich odpowiedź brzmi: "rzuć więcej sprzętu".

Jednak znalazłem sposób na rozwiązanie tego problemu w zakresie ograniczania mojego korzystania z tej funkcji. Kiedy analizowałem zapisane dane wyszukiwania, odkryłem, że moje wyszukiwania składają się z około 100 000 unikalnych wyszukiwań słów kluczowych oraz różnych permutacji filtrów, które tworzą ponad 1 000 000 zapisanych wyszukiwań.

Jeśli patrzę na filtrach są takie rzeczy jak:

  • Lokalizacja - 300+
  • Przemysłu - 50+
  • etc ...

dając przestrzeń rozwiązanie z :

100 000 *> 300 *> 50 * ... ~ => 1 500 000 000

Jednak gdybym rozłożenia wyszukuje i indeks wyszukiwania słów kluczowych i filtrów osobno w indeksie perkolatora, I skończyć z znacznie mniej wyszukiwań:

100 000 +> 300 +> 50 + ... ~ => 100 350

Te same wyszukiwania są mniejsze i mniej skomplikowane niż oryginalne wyszukiwania.

Teraz utworzę drugi (bez perkolatora) indeks zawierający listę 1 000 000 zapisanych wyszukiwań wraz z identyfikatorami składników wyszukiwania z indeksu perkolatora .

Następnie przejmuję dokument, a następnie wykonuję drugie zapytanie, filtrując wyszukiwania pod kątem słowa kluczowego i filtrujących wyników filtrowania. Jestem nawet w stanie zachować wynik trafności, ponieważ jest on zwracany wyłącznie w wyniku wyszukiwania słów kluczowych.

Takie podejście znacznie zmniejszy ślad pamięci indeksu perkolatora przy jednoczesnym zapewnieniu tego samego celu.

Chciałbym zaprosić opinię na temat tego podejścia (jeszcze go nie wypróbowałem, ale będę Cię informował).

Podobnie, jeśli moje podejście się powiedzie, czy uważasz, że warto skorzystać z funkcji?

Powiązane problemy