PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да индексирам postgres таблица по име, когато името може да бъде на всеки език?

Ако искате да оптимизирате произволни съвпадения на подниз, една от опциите е да използвате кода>pg_tgrm модул . Добавяне на индекс:

CREATE INDEX table_location_name_trigrams_key ON table
  USING gin (location_name gin_trgm_ops);

Това ще раздели "Simple Cafe" на "sim", "imp", "mpl" и т.н. и ще добави запис към индекса за всяка тригама във всеки ред. След това програмата за планиране на заявки може автоматично да използва този индекс за съвпадения на модел на подниз, включително:

SELECT * FROM table WHERE location_name ILIKE '%cafe%';

Тази заявка ще търси "caf" и "afe" в индекса, ще намери пресечната точка, ще извлече тези редове, след което ще провери всеки ред спрямо вашия модел. (Тази последна проверка е необходима, тъй като пресечната точка на "caf" и "afe" съвпада както с "simple cafe", така и с "unsafe scaffolding", докато "%cafe%" трябва да съвпада само с едно). Индексът става по-ефективен, когато шаблонът за въвеждане става по-дълъг, тъй като може да изключи повече редове, но все още не е толкова ефективен, колкото индексирането на цели думи, така че не очаквайте подобрение на производителността спрямо to_tsvector .

Уловката е, че триграмите изобщо не работят за модели под три знака. Това може или не може да бъде проблем за вашето приложение.

Редактиране: Първоначално добавих това като коментар.

Имах друга мисъл снощи, когато почти спях. Направете cjk_chars функция, която приема входен низ, regexp_matches целия диапазон на CJK Unicode и връща масив от всякакви такива знаци или NULL ако няма. Добавете GIN индекс към cjk_chars(location_name) . След това потърсете:

WHERE CASE
  WHEN cjk_chars('query') IS NOT NULL THEN
    cjk_chars(location_name) @> cjk_chars('query')
    AND location_name LIKE '%query%'
  ELSE
    <tsvector/trigrams>
  END

Та-да, униграми!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Имена на таблици в Postgresql и unicode:Защо не мога да избера името на таблицата от информационната схема, когато съдържа unicode знаци?

  2. Как да изчислим ненадут брой от денормализирана таблица

  3. Отидете на заявка LIKE на postgresql

  4. Грешка при импортиране на CSV в postgres с python и psycopg2

  5. Как да създам потребител на postgresql с fabric