Różnica między Text a Keyword

W elasticsearch występują dwa typy danych, które często bywają kłopotliwe dla osób niedoświadczonych w pracy z systemem – Keyword i Text. Oba typy są rodzajem stringa, ale elasticsearch inaczej je interpretuje, przez co można na nich wykonać inne operacje.

 

Skąd się bierze typ pola?

Ogółem, to jakim typem jest pole, określa template. Jest to wzorzec tworzenia indexów w elasticsearch – w tym mapowania pól. Jeśli dany template nie określa jasno jakiego typu ma być dane pole, elasticsearch domyślnie stworzy dynamiczny mapping dla typów Keyword i Text. Nie jest jednak to rekomendowane ze względu na przestrzeń dyskową jaką można zaoszczędzić poprzez planowanie przypisanych typów do pól.

 

Index odwrócony

Aby zrozumieć wagę problemu, należy spojrzeć na odwrócony index elasticsearch[1].  Jest to specyficzny sposób w jaki system zapisuje dane i to dzięki temu rozwiązaniu elasticsearch jest bardzo szybki w zwracaniu odpowiedzi nawet w dużej skali czasu.

Odwrócony index działa podobnie do indexu w niektórych książkach. Na końcu książki można znaleźć listę wyrazów z informacją na których stronach się te wyrazy pojawiły. Elasticsearch robi dokładnie to samo dla każdego wyrazu z informacją w którym dokumencie się znajduje.

Przykład dokumentu

Dla przykładu spójrzmy na dokument o id "moj-dokument". Ma on pole "adres", a wartość tego pola to "Wiejska 20, Warszawa".
POST "localhost:9200/moj-index/_doc/moj-dokument" -d'
{
"adres" : "Wiejska 20, Warszawa"
}'

Poniżej prezentacja, jak widzi to elasticsearch w odwróconym indexie dla typów

Keyword

 

Text

Różnica w zapytaniu

Elasticsearch po otrzymaniu zapytania najpierw sprawdza index odwrócony pod względem dopasowania. Jeśli je znajdzie, wyświetla dokumenty, które odpowiadają temu zapytaniu. Dlatego jeśli odpytamy elasticsearch o wartość „Warszawa”, dokument z typem Keyword może nie zwrócić rezultatu, ponieważ wartość to dosłownie „Wiejska 20, Warszawa”. Odwrotnie jest w przypadku typu Text - ponieważ zawartość pola została przeanalizowana, elasticsearch jest w stanie odnaleźć pojedyncze wyrazy w odwróconym indexie i zwrócić odpowiedź w postaci dokumentu.

Oczywiście istnieją jeszcze różne rodzaje zapytań do Elasticsearch i w zależności od tego, które zostaną użyte, można otrzymać różne wyniki. Ta kwestia jednak nie dotyka bezpośrednio różnic w samych typach pól.

 

Podsumowując

Różnice między tymi dwoma polami są znaczące. Generalnie używamy typów keyword dla stałych wartości w danych, których nie chcemy analizować, np. nazwa kraju, aplikacji, itp. Typu Text używamy, kiedy musimy skorzystać z mocy przeszukiwania pełnotekstowego, np. w polu message, które zawiera oryginalną wiadomość z systemu.

 

 

 

[1] Po prawdzie, odwrócony index jest właściwością silnika Apache Lucene, na bazie którego powstał Elasticsearch. Celem ułatwienia zrozumienia problemu, użyto skrótu myślowego.