PG - indeks dla operatora LIKE

0

Nałożyłem indeks BTREE na kolumnę name. Wg dokumentacji, operator LIKE bez gwiazdki z przodu powinien użyć indeksu. Niestety leci sekwencyjnie..
https://www.postgresql.org/docs/9.4/static/indexes-types.html

No chyba, że rozchodzi się o ten fragment, ale nie bardzo wiem o co w tym chodzi:

However, if your database does not use the C locale you will need to create the index with a special operator class to support indexing of pattern-matching queries

Moje zapytanie:
explain select * from XXXX where name like 'fi%'

Kodowanie bazy to pl_PL.UTF-8, ale kolumna docelowo będzie raczej zawierała tylko ASCII. Zastanawiam się jeszcze czy bawić się w unaccent po stronie postgresa, czy lepiej po stronie aplikacji zapisywać wersję znormalizowaną i na niej robić LIKE.

0

najpierw zrób vacuum analyze XXXX, gdzie XXXX to nazwa twojej tabeli. Jak to nie pomoże to do indeksu, za nazwą pola, po spacji, dodaj pg_catalog.text_pattern_ops i jeszcze raz vacuum

0

Tak jak piszesz. Trzeba było dać tak jak pisało w dokumentacji, tj tworząc indeks dodając konstrukcję varchar_pattern_ops. Teraz explain pokazuje, że używa indeksu.

Tylko nadal się zastanawiam co jest lepszym podejściem przy szukaniu przez LIKE: czy przerzucenie na bazę danych funkcji lower oraz unaccent czy lepiej zrobić drugą kolumnę i przygotować te dane po stronie aplikacji i zapisać. Wtedy LIKE będzie dość prosty i na 100% poleci z indeksu.

0

nie bardzo rozumiem o co pytasz - możesz przecież założyć indeks funkcyjny na (lower(pole) varchar_pattern_ops zamiast dodawać nowe pole z wartością lower(stare_pole)

0

chodzi o szukanie (ignorowanie) Ą ć ś i inne tego typu literki. Czyli Środa i Sroda to jest to samo.

0

to może zamiast tego użyj indeksu trigram http://blog.scoutapp.com/articles/2016/07/12/how-to-make-text-searches-in-postgresql-faster-with-trigram-similarity i wg mnie lepiej dodać dodatkową kolumnę, wypełnianą triggerem jako 'new.nowe_pole := unaccent(new.stare_pole)`

0

Na tę chwilę zdecydowałem się na nową kolumnę. Bo nie tylko akcenty, ale np apostrofy też nie powinny być brane pod uwagę. Triggerów nie preferuję, ale mam odpowiednie Zdarzenia w Railsach.

0

to już jak kto woli

1 użytkowników online, w tym zalogowanych: 0, gości: 1