F.50. pg_trgm â поддеÑжка опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑ Ð¾Ð¶ÐµÑÑи ÑекÑÑа на оÑнове ÑÑигÑамм #
- F.50.1. ÐонÑÑиÑ, ÑвÑзаннÑе Ñ ÑÑигÑаммами (или ÑÑигÑаÑами)
- F.50.2. ФÑнкÑии и опеÑаÑоÑÑ
- F.50.3. ÐаÑамеÑÑÑ GUC
- F.50.4. ÐоддеÑжка индекÑов
- F.50.5. ÐнÑегÑаÑÐ¸Ñ Ñ ÑекÑÑовÑм поиÑком
- F.50.6. СÑÑлки
- F.50.7. ÐвÑоÑÑ
- F.50.2. ФÑнкÑии и опеÑаÑоÑÑ
ÐодÑÐ»Ñ pg_trgm пÑедоÑÑавлÑÐµÑ ÑÑнкÑии и опеÑаÑоÑÑ Ð´Ð»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑ
ожеÑÑи алÑавиÑно-ÑиÑÑовÑÑ
ÑÑÑок на оÑнове ÑÑигÑамм, а Ñакже клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов индекÑов, поддеÑживаÑÑие бÑÑÑÑÑй поиÑк ÑÑ
ожиÑ
ÑÑÑок.
ÐаннÑй модÑÐ»Ñ ÑÑиÑаеÑÑÑ Â«Ð´Ð¾Ð²ÐµÑеннÑм», Ñо еÑÑÑ ÐµÐ³Ð¾ могÑÑ ÑÑÑанавливаÑÑ Ð¾Ð±ÑÑнÑе полÑзоваÑели, имеÑÑие пÑаво CREATE в ÑекÑÑей базе даннÑÑ
.
F.50.1. ÐонÑÑиÑ, ÑвÑзаннÑе Ñ ÑÑигÑаммами (или ÑÑигÑаÑами) #
ТÑигÑамма â ÑÑо гÑÑппа ÑÑÑÑ Ð¿Ð¾ÑледоваÑелÑнÑÑ Ñимволов, взÑÑÑÑ Ð¸Ð· ÑÑÑоки. ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ измеÑиÑÑ ÑÑ Ð¾Ð¶ÐµÑÑÑ Ð´Ð²ÑÑ ÑÑÑок, подÑÑиÑав ÑиÑло ÑÑигÑамм, коÑоÑÑе еÑÑÑ Ð² Ð¾Ð±ÐµÐ¸Ñ . ÐÑа пÑоÑÑÐ°Ñ Ð¸Ð´ÐµÑ Ð¾ÐºÐ°Ð·ÑваеÑÑÑ Ð¾ÑÐµÐ½Ñ ÑÑÑекÑивной Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÑÐµÐ½Ð¸Ñ ÑÑ Ð¾Ð¶ÐµÑÑи Ñлов на Ð¼Ð½Ð¾Ð³Ð¸Ñ ÐµÑÑеÑÑвеннÑÑ ÑзÑÐºÐ°Ñ .
ÐÑимеÑание
pg_trgm, Ð¸Ð·Ð²Ð»ÐµÐºÐ°Ñ ÑÑигÑÐ°Ð¼Ð¼Ñ Ð¸Ð· ÑÑÑок, игноÑиÑÑÐµÑ ÑимволÑ, не оÑноÑÑÑиеÑÑ Ðº Ñловам (не алÑавиÑно-ÑиÑÑовÑе). ÐÑи вÑделении ÑÑигÑамм, ÑодеÑжаÑиÑ
ÑÑ Ð² ÑÑÑоке, ÑÑиÑаеÑÑÑ, ÑÑо пеÑед каждÑм Ñловом наÑ
одÑÑÑÑ Ð´Ð²Ð° пÑобела, а поÑле â один пÑобел. ÐапÑимеÑ, из ÑÑÑоки «cat» вÑделÑеÑÑÑ Ð½Ð°Ð±Ð¾Ñ ÑÑигÑамм: « c», « ca», «cat» и «at ». Ðз ÑÑÑоки «foo|bar» вÑделÑÑÑÑÑ ÑÑигÑаммÑ: « f», « fo», «foo», «oo », « b», « ba», «bar» и «ar ».
F.50.2. ФÑнкÑии и опеÑаÑоÑÑ #
РеализованнÑе в модÑле pg_trgm ÑÑнкÑии пеÑеÑиÑÐ»ÐµÐ½Ñ Ð² ТаблиÑе F.30, а опеÑаÑоÑÑ â в ТаблиÑе F.31.
ТаблиÑа F.30. ФÑнкÑии pg_trgm
РаÑÑмоÑÑим ÑледÑÑÑий пÑимеÑ:
# SELECT word_similarity('word', 'two words');
word_similarity
-----------------
0.8
(1 row) ÐÐ°Ð±Ð¾Ñ ÑÑигÑамм Ð´Ð»Ñ Ð¿ÐµÑвой ÑÑÑоки: {" w"," wo","wor","ord","rd "}. Ðо вÑоÑой ÑÑÑоке ÑпоÑÑдоÑеннÑй Ð½Ð°Ð±Ð¾Ñ ÑÑигÑамм: {" t"," tw","two","wo "," w"," wo","wor","ord","rds","ds "}. Ðаиболее близкий ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ ÑпоÑÑдоÑенного множеÑÑва ÑÑигÑамм во вÑоÑой ÑÑÑоке: {" w"," wo","wor","ord"}, а коÑÑÑиÑÐ¸ÐµÐ½Ñ ÑÑ
ожеÑÑи Ñавен 0.8.
ÐÑа ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение, коÑоÑое можно пÑимеÑно воÑпÑинимаÑÑ ÐºÐ°Ðº макÑималÑнÑÑ Ð¾ÑÐµÐ½ÐºÑ ÑÑ Ð¾Ð¶ÐµÑÑи пеÑвой ÑÑÑоки Ñ Ð»Ñбой подÑÑÑокой вÑоÑой ÑÑÑоки. ÐÐ°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð½Ðµ добавлÑÐµÑ Ð¿ÑÐ¾Ð±ÐµÐ»Ñ Ðº гÑаниÑам ÑÑагменÑа, поÑÑÐ¾Ð¼Ñ Ñовпадение Ñ Ð¾ÑделÑнÑм Ñловом оÑениваеÑÑÑ Ð²ÑÑе, Ñем Ñовпадение Ñ ÑаÑÑÑÑ Ñлова.
ÐÑи ÑÑом strict_word_similarity вÑбиÑÐ°ÐµÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ Ñлов во вÑоÑой ÑÑÑоке. Рпоказанном вÑÑе пÑимеÑе strict_word_similarity вÑбеÑÐµÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ Ð¸Ð· одного Ñлова 'words', коÑоÑой ÑооÑвеÑÑÑвÑÑÑ ÑÑигÑÐ°Ð¼Ð¼Ñ {" w"," wo","wor","ord","rds","ds "}.
# SELECT strict_word_similarity('word', 'two words'), similarity('word', 'words');
strict_word_similarity | similarity
------------------------+------------
0.571429 | 0.571429
(1 row)Таким обÑазом, ÑÑнкÑÐ¸Ñ strict_word_similarity полезна Ð´Ð»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑ
ожеÑÑи ÑелÑÑ
Ñлов, а word_similarity болÑÑе подÑ
Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑ
ожеÑÑи ÑаÑÑей Ñлов.
ТаблиÑа F.31. ÐпеÑаÑоÑÑ pg_trgm
ÐпеÑаÑÐ¾Ñ ÐпиÑание |
|---|
ÐозвÑаÑÐ°ÐµÑ |
ÐозвÑаÑÐ°ÐµÑ |
ÐоммÑÑиÑÑÑÑий опеÑаÑÐ¾Ñ Ð´Ð»Ñ |
ÐозвÑаÑÐ°ÐµÑ |
ÐоммÑÑиÑÑÑÑий опеÑаÑÐ¾Ñ Ð´Ð»Ñ |
ÐозвÑаÑÐ°ÐµÑ Â«ÑаÑÑÑоÑние» Ð¼ÐµÐ¶Ð´Ñ Ð°ÑгÑменÑами, Ñо еÑÑÑ Ð¾Ð´Ð¸Ð½ минÑÑ Ð·Ð½Ð°Ñение |
ÐозвÑаÑÐ°ÐµÑ Â«ÑаÑÑÑоÑние» Ð¼ÐµÐ¶Ð´Ñ Ð°ÑгÑменÑами, Ñо еÑÑÑ Ð¾Ð´Ð¸Ð½ минÑÑ Ð·Ð½Ð°Ñение |
ÐоммÑÑиÑÑÑÑий опеÑаÑÐ¾Ñ Ð´Ð»Ñ |
ÐозвÑаÑÐ°ÐµÑ Â«ÑаÑÑÑоÑние» Ð¼ÐµÐ¶Ð´Ñ Ð°ÑгÑменÑами, Ñо еÑÑÑ Ð¾Ð´Ð¸Ð½ минÑÑ Ð·Ð½Ð°Ñение |
ÐоммÑÑиÑÑÑÑий опеÑаÑÐ¾Ñ Ð´Ð»Ñ |
F.50.3. ÐаÑамеÑÑÑ GUC #
pg_trgm.similarity_threshold(real) #ÐадаÑÑ ÑекÑÑий поÑог ÑÑ Ð¾Ð¶ÐµÑÑи, коÑоÑÑй иÑполÑзÑÐµÑ Ð¾Ð¿ÐµÑаÑоÑ
%. ÐÑо знаÑение должно бÑÑÑ Ð² диапазоне Ð¾Ñ 0 до 1 (по ÑмолÑÐ°Ð½Ð¸Ñ 0.3).pg_trgm.word_similarity_threshold(real) #ÐадаÑÑ ÑекÑÑий поÑог ÑÑ Ð¾Ð¶ÐµÑÑи Ñлов, коÑоÑÑй иÑполÑзÑÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ
<%и%>. ÐÑо знаÑение должно бÑÑÑ Ð² диапазоне Ð¾Ñ 0 до 1 (по ÑмолÑÐ°Ð½Ð¸Ñ 0.6).pg_trgm.strict_word_similarity_threshold(real) #ÐадаÑÑ ÑекÑÑий поÑог ÑÑ Ð¾Ð¶ÐµÑÑи ÑÑÑого Ñлов, коÑоÑÑй иÑполÑзÑÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ
<<%и%>>. ÐÑо знаÑение должно бÑÑÑ Ð² диапазоне Ð¾Ñ 0 до 1 (по ÑмолÑÐ°Ð½Ð¸Ñ 0.5).
F.50.4. ÐоддеÑжка индекÑов #
ÐодÑÐ»Ñ pg_trgm пÑедоÑÑавлÑÐµÑ ÐºÐ»Ð°ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов индекÑов GiST и GIN, позволÑÑÑие ÑоздаваÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾ ÑекÑÑовÑм ÑÑолбÑам Ð´Ð»Ñ Ð¾ÑÐµÐ½Ñ Ð±ÑÑÑÑого поиÑка по кÑиÑеÑÐ¸Ñ ÑÑ
ожеÑÑи. ÐÑи ÑÐ¸Ð¿Ñ Ð¸Ð½Ð´ÐµÐºÑов поддеÑживаÑÑ Ð²ÑÑеопиÑаннÑе опеÑаÑоÑÑ ÑÑ
ожеÑÑи и дополниÑелÑно поддеÑживаÑÑ Ð¿Ð¾Ð¸Ñк на оÑнове ÑÑигÑамм Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов Ñ LIKE, ILIKE, ~, ~* и =. Ð ÑÑандаÑÑной ÑбоÑке pg_trgm ÑегиÑÑÑ Ð¿Ñи опÑеделении ÑÑ
ожеÑÑи не ÑÑиÑÑваеÑÑÑ. ÐпеÑаÑоÑÑ Ð½ÐµÑавенÑÑва не поддеÑживаÑÑÑÑ. ÐбÑаÑиÑе внимание, ÑÑо Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑов ÑавенÑÑва ÑÑи индекÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð½Ðµ Ñак ÑÑÑекÑивнÑ, как индекÑÑ-B-деÑевÑÑ.
ÐÑимеÑ:
CREATE TABLE test_trgm (t text); CREATE INDEX trgm_idx ON test_trgm USING GIST (t gist_trgm_ops);
или
CREATE INDEX trgm_idx ON test_trgm USING GIN (t gin_trgm_ops);
ÐлаÑÑ Ð¾Ð¿ÐµÑаÑоÑов GiST gist_trgm_ops аппÑокÑимиÑÑÐµÑ Ð½Ð°Ð±Ð¾Ñ ÑÑигÑамм в виде ÑигнаÑÑÑÑ Ð±Ð¸Ñовой каÑÑÑ. Рего необÑзаÑелÑном ÑелоÑиÑленном паÑамеÑÑе siglen можно задаÑÑ ÑÐ°Ð·Ð¼ÐµÑ ÑигнаÑÑÑÑ Ð² байÑаÑ
. ÐаÑамеÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинимаÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¾Ñ 1 до 2024, по ÑмолÑÐ°Ð½Ð¸Ñ Ð¾Ð½ Ñавен 12. ÐÑи ÑвелиÑении ÑазмеÑа ÑигнаÑÑÑÑ Ð¿Ð¾Ð¸Ñк ÑабоÑÐ°ÐµÑ ÑоÑнее (ÑканиÑÑеÑÑÑ Ð¼ÐµÐ½ÑÑÐ°Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð² индекÑе и менÑÑе ÑÑÑÐ°Ð½Ð¸Ñ ÐºÑÑи), но Ñам Ð¸Ð½Ð´ÐµÐºÑ ÑÑановиÑÑÑ Ð±Ð¾Ð»ÑÑе.
ÐÑÐ¸Ð¼ÐµÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñакого индекÑа Ñ Ð´Ð»Ð¸Ð½Ð¾Ð¹ ÑигнаÑÑÑÑ 32 байÑа:
CREATE INDEX trgm_idx ON test_trgm USING GIST (t gist_trgm_ops(siglen=32));
Ðа ÑÑÐ¾Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ Ñ Ð²Ð°Ñ Ð±ÑÐ´ÐµÑ Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾ ÑÑолбÑÑ t, иÑполÑзÑÑ ÐºÐ¾ÑоÑÑй можно оÑÑÑеÑÑвлÑÑÑ Ð¿Ð¾Ð¸Ñк по ÑÑ
ожеÑÑи. ÐÑÐ¸Ð¼ÐµÑ ÑипиÑного запÑоÑа:
SELECT t, similarity(t, 'Ñлово') AS sml FROM test_trgm WHERE t % 'Ñлово' ORDER BY sml DESC, t;
Ðн вÑдаÑÑ Ð²Ñе знаÑÐµÐ½Ð¸Ñ Ð² ÑекÑÑовом ÑÑолбÑе, коÑоÑÑе доÑÑаÑоÑно ÑÑ
ожи Ñо Ñловом word, в поÑÑдке ÑоÑÑиÑовки Ð¾Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ к наименее ÑÑ
ожим. ÐлагодаÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа, ÑÑа опеÑаÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð±ÑÑÑÑой даже Ñ Ð¾ÑÐµÐ½Ñ Ð±Ð¾Ð»ÑÑими набоÑами даннÑÑ
.
ÐÑÑгой ваÑÐ¸Ð°Ð½Ñ Ð¿ÑедÑдÑÑего запÑоÑа:
SELECT t, t <-> 'Ñлово' AS dist
FROM test_trgm
ORDER BY dist LIMIT 10;Ðн Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð¾Ð²Ð¾Ð»Ñно ÑÑÑекÑивно вÑполнен Ñ Ð¿Ñименением индекÑов GiST, а не GIN. ÐбÑÑно он вÑигÑÑÑнее пеÑвого ваÑианÑа ÑолÑко когда ÑÑебÑеÑÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑое колиÑеÑÑво Ð±Ð»Ð¸Ð·ÐºÐ¸Ñ Ñовпадений.
Также Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾ ÑÑолбÑÑ t Ð´Ð»Ñ Ð¾Ñенки ÑÑ
ожеÑÑи Ñлов ÑÑловнÑÑ
и оÑенки ÑÑ
ожеÑÑи Ñлов в ÑÑÑогом ÑмÑÑле. ÐÑимеÑÑ ÑипиÑнÑÑ
запÑоÑов:
SELECT t, word_similarity('Ñлово', t) AS sml
FROM test_trgm
WHERE 'Ñлово' <% t
ORDER BY sml DESC, t;и
SELECT t, strict_word_similarity('Ñлово', t) AS sml
FROM test_trgm
WHERE 'Ñлово' <<% t
ORDER BY sml DESC, t; Ð ÑезÑлÑÑаÑе бÑдÑÑ Ð²Ð¾Ð·Ð²ÑаÑÐµÐ½Ñ Ð²Ñе знаÑÐµÐ½Ð¸Ñ Ð² ÑекÑÑовом ÑÑолбÑе, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
найдеÑÑÑ Ð½ÐµÐ¿ÑеÑÑвнÑй ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ Ð² ÑпоÑÑдоÑенном набоÑе ÑÑигÑамм, доÑÑаÑоÑно ÑÑ
ожий Ñ Ð½Ð°Ð±Ð¾Ñом ÑÑигÑамм ÑÑÑоки Ñлово. ÐаннÑе знаÑÐµÐ½Ð¸Ñ Ð±ÑдÑÑ Ð¾ÑÑоÑÑиÑÐ¾Ð²Ð°Ð½Ñ Ð¿Ð¾ поÑÑÐ´ÐºÑ Ð¾Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ к наименее ÑÑ
ожим. ÐÑÐ¾Ñ Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ ÑÑкоÑиÑÑ Ð¿Ð¾Ð¸Ñк даже Ñ Ð¾ÑÐµÐ½Ñ Ð±Ð¾Ð»ÑÑим обÑÑмом даннÑÑ
.
ÐÑÑгие возможнÑе ваÑианÑÑ Ð¿ÑедÑдÑÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑов:
SELECT t, 'Ñлово' <<-> t AS dist
FROM test_trgm
ORDER BY dist LIMIT 10;и
SELECT t, 'Ñлово' <<<-> t AS dist
FROM test_trgm
ORDER BY dist LIMIT 10;Ðни могÑÑ Ð±ÑÑÑ Ð´Ð¾Ð²Ð¾Ð»Ñно ÑÑÑекÑивно вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ñ Ñ Ð¿Ñименением индекÑов GiST, а не GIN.
ÐаÑÐ¸Ð½Ð°Ñ Ñ PostgreSQL 9.1, ÑÑи ÑÐ¸Ð¿Ñ Ð¸Ð½Ð´ÐµÐºÑов Ñакже поддеÑживаÑÑ Ð¿Ð¾Ð¸Ñк Ñ Ð¾Ð¿ÐµÑаÑоÑами LIKE и ILIKE, напÑимеÑ:
SELECT * FROM test_trgm WHERE t LIKE '%foo%bar';
ÐÑи Ñаком поиÑке по индекÑÑ ÑнаÑала из иÑкомой ÑÑÑоки извлекаÑÑÑÑ ÑÑигÑаммÑ, а заÑем они иÑÑÑÑÑ Ð² индекÑе. Чем болÑÑе ÑÑигÑамм оказÑваеÑÑÑ Ð² иÑкомой ÑÑÑоке, Ñем более ÑÑÑекÑивнÑм бÑÐ´ÐµÑ Ð¿Ð¾Ð¸Ñк по индекÑÑ. РоÑлиÑие Ð¾Ñ Ð¿Ð¾Ð¸Ñка по B-деÑевÑ, иÑÐºÐ¾Ð¼Ð°Ñ ÑÑÑока не должна пÑивÑзÑваÑÑÑÑ Ðº Ð»ÐµÐ²Ð¾Ð¼Ñ ÐºÑаÑ.
ÐаÑÐ¸Ð½Ð°Ñ Ñ PostgreSQL 9.3, индекÑÑ ÑÑиÑ
Ñипов Ñакже поддеÑживаÑÑ Ð¿Ð¾Ð¸Ñк по ÑегÑлÑÑнÑм вÑÑажениÑм (опеÑаÑоÑÑ ~ и ~*), напÑимеÑ:
SELECT * FROM test_trgm WHERE t ~ '(foo|bar)';
ÐÑи Ñаком поиÑке из ÑегÑлÑÑного вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð·Ð²Ð»ÐµÐºÐ°ÑÑÑÑ ÑÑигÑаммÑ, а заÑем они иÑÑÑÑÑ Ð² индекÑе. Чем болÑÑе ÑÑигÑамм ÑдаÑÑÑÑ Ð¸Ð·Ð²Ð»ÐµÑÑ Ð¸Ð· ÑегÑлÑÑного вÑÑажениÑ, Ñем более ÑÑÑекÑивнÑм бÑÐ´ÐµÑ Ð¿Ð¾Ð¸Ñк по индекÑÑ. РоÑлиÑие Ð¾Ñ Ð¿Ð¾Ð¸Ñка по B-деÑевÑ, иÑÐºÐ¾Ð¼Ð°Ñ ÑÑÑока не должна пÑивÑзÑваÑÑÑÑ Ðº Ð»ÐµÐ²Ð¾Ð¼Ñ ÐºÑаÑ.
ÐÑноÑиÑелÑно поиÑка по ÑегÑлÑÑÐ½Ð¾Ð¼Ñ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ñ LIKE, имейÑе в видÑ, ÑÑо пÑи оÑÑÑÑÑÑвии ÑÑигÑамм в иÑкомом Ñаблоне поиÑк ÑводиÑÑÑ Ðº Ð¿Ð¾Ð»Ð½Ð¾Ð¼Ñ ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа.
ÐÑÐ±Ð¾Ñ Ð¼ÐµÐ¶Ð´Ñ Ð¸Ð½Ð´ÐµÐºÑами GiST и GIN завиÑÐ¸Ñ Ð¾Ñ Ð¾ÑноÑиÑелÑнÑÑ Ñ Ð°ÑакÑеÑиÑÑик пÑоизводиÑелÑноÑÑи GiST и GIN, коÑоÑÑе здеÑÑ Ð½Ðµ ÑаÑÑмаÑÑиваÑÑÑÑ.
F.50.5. ÐнÑегÑаÑÐ¸Ñ Ñ ÑекÑÑовÑм поиÑком #
СопоÑÑавление ÑÑигÑамм â оÑÐµÐ½Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñй пÑиÑм в ÑоÑеÑании Ñ Ð¿Ñименением полноÑекÑÑового индекÑа. Ð ÑаÑÑноÑÑи ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð¼Ð¾ÑÑ Ð½Ð°Ð¹Ñи Ñлова, напиÑаннÑе непÑавилÑно, коÑоÑÑе не бÑдÑÑ Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð¾Ð¼ полноÑекÑÑового поиÑка.
РпеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ Ð½Ñжно поÑÑÑоиÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ ÑаблиÑÑ, ÑодеÑжаÑÑÑ Ð²Ñе ÑникалÑнÑе Ñлова в докÑменÑе:
CREATE TABLE words AS SELECT word FROM
ts_stat('SELECT to_tsvector(''simple'', bodytext) FROM documents'); ÐдеÑÑ documents â ÑÑо ÑаблиÑа Ñ ÑекÑÑовÑм полем bodytext, по коÑоÑÐ¾Ð¼Ñ Ð¼Ñ Ð±Ñдем вÑполнÑÑÑ Ð¿Ð¾Ð¸Ñк. ÐонÑигÑÑаÑÐ¸Ñ simple иÑполÑзÑеÑÑÑ Ñ ÑÑнкÑией to_tsvector вмеÑÑо конÑигÑÑаÑии Ð´Ð»Ñ Ð¾Ð¿ÑеделÑнного ÑзÑка по Ñой пÑиÑине, ÑÑо нам нÑжен ÑпиÑок иÑÑ
однÑÑ
(необÑабоÑаннÑÑ
ÑÑеммеÑом) Ñлов.
ÐаÑем нÑжно ÑоздаÑÑ Ð¸Ð½Ð´ÐµÐºÑ ÑÑигÑамм по ÑÑолбÑÑ Ñо Ñловами:
CREATE INDEX words_idx ON words USING GIN (word gin_trgm_ops);
ТепеÑÑ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ SELECT, подобнÑй Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ Ð² пÑедÑдÑÑем пÑимеÑе, и пÑедлагаÑÑ Ð²Ð°ÑианÑÑ Ð¸ÑпÑавлений Ñлов, введÑннÑÑ
полÑзоваÑелем Ñ Ð¾Ñибками. ÐÑоме Ñого, Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ дополниÑелÑно пÑовеÑиÑÑ, ÑÑо вÑбÑаннÑе Ñлова Ñакже имеÑÑ Ð´Ð»Ð¸Ð½Ñ, пÑимеÑно ÑавнÑÑ Ð´Ð»Ð¸Ð½Ðµ оÑибоÑнÑÑ
Ñлов.
ÐÑимеÑание
Так как ÑаблиÑа words бÑла ÑÑоÑмиÑована как оÑделÑÐ½Ð°Ñ ÑÑаÑиÑеÑÐºÐ°Ñ ÑаблиÑа, ÐµÑ Ð½Ñжно пеÑиодиÑеÑки обновлÑÑÑ, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð° доÑÑаÑоÑно Ñ
оÑоÑо ÑооÑвеÑÑÑвовала набоÑÑ Ð´Ð¾ÐºÑменÑов. ÐоÑÑоÑнно поддеÑживаÑÑ ÐµÑ Ð² полноÑÑÑÑ Ð°ÐºÑÑалÑном ÑоÑÑоÑнии обÑÑно не ÑÑебÑеÑÑÑ.
F.50.6. СÑÑлки #
Ð¡Ð°Ð¹Ñ ÑазÑабоÑки GiST http://www.sai.msu.su/~megera/postgres/gist/
Ð¡Ð°Ð¹Ñ ÑазÑабоÑки Tsearch2 http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/
F.50.7. ÐвÑоÑÑ #
Ðлег ÐаÑÑÑнов <[email protected]>, ÐоÑква, ÐоÑковÑкий ÐоÑÑдаÑÑÑвеннÑй УнивеÑÑиÑеÑ, РоÑÑиÑ
ФÑÐ´Ð¾Ñ Ð¡Ð¸Ð³Ð°ÐµÐ² <[email protected]>, ÐоÑква, ÐÐР«ÐелÑÑа-СоÑÑ», РоÑÑиÑ
ÐлекÑÐ°Ð½Ð´Ñ ÐоÑоÑков <[email protected]>, ÐоÑква, Postgres Professional, РоÑÑиÑ
ÐокÑменÑаÑиÑ: ÐÑиÑÑоÑÐµÑ ÐингÑ-Ðинн
РазÑабоÑÐºÑ ÑÑого модÑÐ»Ñ ÑпонÑиÑовало ÐÐР«ÐелÑÑа-СоÑÑ», г. ÐоÑква, РоÑÑиÑ.