Эффективный способ найти точное упорядоченное соответствие строки, префикса и постфикса в PostgreSQL - PullRequest
0 голосов
/ 10 июля 2019

Учитывая имя таблицы table и строковый столбец с именем column, я хочу найти слово word в этом столбце следующим образом: точное совпадение должно быть сверху, затем идут префиксные совпадения и, наконец, постфиксспички.

В настоящее время я получил следующие решения:

Решение 1:

select column
from (select column,
             case
                 when column like 'word' then 1
                 when column like 'word%' then 2
                 when column like '%word' then 3
                 end as rank
      from table) as ranked
where rank is not null
order by rank;

Решение 2:

select column
from table
where column like 'word'
   or column like 'word%'
   or column like '%word'
order by case
             when column like 'word' then 1
             when column like 'word%' then 2
             when column like '%word' then 3
             end;

Теперь мой вопрос какойодно из двух решений более эффективно или еще лучше, есть ли решение лучше, чем оба?

1 Ответ

0 голосов
/ 10 июля 2019

Ваше 2-е решение выглядит более простым для оптимизации планировщиком, но не исключено, что первое решение получит тот же план.

Для Где, не нужно, поскольку оно покрыто; БД может сделать 2 проверки вместо одной.

Но самая большая проблема - третья, так как она не может быть оптимизирована с помощью индекса.

Так или иначе, PostgreSQL будет сканировать вашу полную таблицу и вручную извлечь совпадения. Это будет медленно для 20 000 или более строк.

Я рекомендую вам изучить нечеткие совпадения строк и полнотекстовый поиск; похоже, это то, что вы пытаетесь подражать.

Даже если вы не хотите использовать полную мощность FTS или нечеткое сопоставление строк, вам определенно следует добавить расширение «pgtrgm», так как оно позволит вам добавить индекс GIN для столбца, который ускорит LIKE '% word 'поиски.

https://www.postgresql.org/docs/current/pgtrgm.html

А если серьезно, взгляните на FTS. Это обеспечивает рейтинг. Если ваши требования строго соответствуют описанным вами, вы все равно можете выполнить запрос FTS к «предварительному фильтру», а затем применить эту логику.

В PostgreSQL FTS есть множество вводных статей, вот одна из них: https://www.compose.com/articles/mastering-postgresql-tools-full-text-search-and-phrase-search/

И даже недавно я написал сообщение, добавив поиск FTS на свой сайт: https://deavid.wordpress.com/2019/05/28/sedice-adding-fts-with-postgresql-was-really-easy/

...