12.4. ÐополниÑелÑнÑе возможноÑÑи
Ð ÑÑом Ñазделе опиÑÑваÑÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе ÑÑнкÑии и опеÑаÑоÑÑ, коÑоÑÑе могÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ Ð¿Ñи поиÑке ÑекÑÑа.
12.4.1. ÐбÑабоÑка докÑменÑов
Ð ÐодÑазделе 12.3.1 показÑвалоÑÑ, как обÑÑнÑе ÑекÑÑовÑе докÑменÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ пÑеобÑазоваÑÑ Ð² знаÑÐµÐ½Ð¸Ñ tsvector. Postgres Pro пÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ Ñакже Ð½Ð°Ð±Ð¾Ñ ÑÑнкÑий и опеÑаÑоÑов Ð´Ð»Ñ Ð¾Ð±ÑабоÑки докÑменÑов, Ñже пÑедÑÑавленнÑÑ
в ÑоÑмаÑе tsvector.
-
tsvector||tsvector ÐпеÑаÑÐ¾Ñ ÐºÐ¾Ð½ÐºÐ°ÑенаÑии знаÑений
tsvectorвозвÑаÑÐ°ÐµÑ Ð²ÐµÐºÑоÑ, обÑединÑÑÑий лекÑÐµÐ¼Ñ Ð¸ позиÑионнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð´Ð²ÑÑ Ð²ÐµÐºÑоÑов, пеÑеданнÑÑ ÐµÐ¼Ñ Ð² аÑгÑменÑÐ°Ñ . РполÑÑенном ÑезÑлÑÑаÑе ÑÐ¾Ñ ÑанÑÑÑÑÑ Ð¿Ð¾Ð·Ð¸Ñии и меÑки веÑов. ÐÑи ÑÑом позиÑии в векÑоÑе ÑпÑава ÑдвигаÑÑÑÑ Ð½Ð° макÑималÑное знаÑение позиÑии в векÑоÑе Ñлева, ÑÑо поÑÑи ÑавноÑилÑно пÑименениÑto_tsvectorк ÑезÑлÑÑаÑÑ ÐºÐ¾Ð½ÐºÐ°ÑенаÑии двÑÑ Ð¸ÑÑ Ð¾Ð´Ð½ÑÑ ÑÑÑок докÑменÑов. (ÐоÑÑи, поÑÐ¾Ð¼Ñ ÑÑо ÑÑоп-Ñлова, иÑклÑÑаемÑе в конÑе левого аÑгÑменÑа, пÑи конкаÑенаÑии иÑÑ Ð¾Ð´Ð½ÑÑ ÑÑÑок влиÑÑÑ Ð½Ð° позиÑии лекÑем в пÑавой ÑаÑÑи, а пÑи конкаÑенаÑииtsvectorâ неÑ.)ÐÑеимÑÑеÑÑво же конкаÑенаÑии докÑменÑов в векÑоÑной ÑоÑме по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ ÐºÐ¾Ð½ÐºÐ°ÑенаÑией ÑекÑÑа до вÑзова
to_tsvectorзаклÑÑаеÑÑÑ Ð² Ñом, ÑÑо Ñак можно ÑазбиÑаÑÑ ÑазнÑе ÑаÑÑи докÑменÑа, пÑименÑÑ ÑазнÑе конÑигÑÑаÑии. Ð Ñак как ÑÑнкÑиÑsetweightпомеÑÐ°ÐµÑ Ð²Ñе лекÑÐµÐ¼Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ векÑоÑа одинаково, ÑазбиÑаÑÑ ÑекÑÑ Ð¸ вÑполнÑÑÑsetweightнÑжно до обÑÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÑазнÑÑ ÑаÑÑей докÑменÑа Ñ Ð¿Ð¾Ð´ÑазÑмеваемÑм ÑазнÑм веÑом.-
setweight(векÑоÑtsvector,веÑ"char") returnstsvector setweightвозвÑаÑÐ°ÐµÑ ÐºÐ¾Ð¿Ð¸Ñ Ð²Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ векÑоÑа, помеÑÐ°Ñ Ð² ней каждÑÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ Ð·Ð°Ð´Ð°Ð½Ð½ÑмвеÑом, меÑкойA,B,CилиD. (ÐеÑкаDпо ÑмолÑÐ°Ð½Ð¸Ñ Ð½Ð°Ð·Ð½Ð°ÑаеÑÑÑ Ð²Ñем векÑоÑам, Ñак ÑÑо пÑи вÑводе она опÑÑкаеÑÑÑ.) ÐÑи меÑки ÑÐ¾Ñ ÑанÑÑÑÑÑ Ð¿Ñи конкаÑенаÑии векÑоÑов, ÑÑо позволÑÐµÑ Ð¿ÑидаваÑÑ ÑазнÑе веÑа Ñловам из ÑазнÑÑ ÑаÑÑей докÑменÑа и, как ÑледÑÑвие, ÑанжиÑоваÑÑ Ð¸Ñ Ð¿Ð¾-ÑазномÑ.ÐамеÑÑÑе, ÑÑо веÑа назнаÑаÑÑÑÑ Ð¿Ð¾Ð·Ð¸ÑиÑм, а не лекÑемам. ÐÑли Ð²Ñ Ð¾Ð´Ð½Ð¾Ð¹ векÑÐ¾Ñ Ð¾ÑиÑен Ð¾Ñ Ð¿Ð¾Ð·Ð¸Ñионной инÑоÑмаÑии,
setweightне Ð´ÐµÐ»Ð°ÐµÑ Ð½Ð¸Ñего.-
length(векÑоÑtsvector) returnsinteger ÐозвÑаÑÐ°ÐµÑ ÑиÑло лекÑем, ÑÐ¾Ñ ÑанÑннÑÑ Ð² векÑоÑе.
-
strip(векÑоÑtsvector) returnstsvector ÐозвÑаÑÐ°ÐµÑ Ð²ÐµÐºÑÐ¾Ñ Ñ Ñеми же лекÑемами, ÑÑо и в данном, но без инÑоÑмаÑии о позиÑии и веÑе. ÐÑиÑеннÑй векÑÐ¾Ñ Ð¾Ð±ÑÑно оказÑваеÑÑÑ Ð½Ð°Ð¼Ð½Ð¾Ð³Ð¾ менÑÑе иÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾, но пÑи ÑÑом и менее полезнÑм. С оÑиÑеннÑми векÑоÑами Ñ Ñже ÑабоÑÐ°ÐµÑ ÑанжиÑование, а Ñакже опеÑаÑоÑ
<->(ÐÐ ÐÐШÐСТÐУÐТ) Ñипаtsqueryникогда не найдÑÑ ÑооÑвеÑÑÑвие в Ð½Ð¸Ñ , Ñак как не ÑÐ¼Ð¾Ð¶ÐµÑ Ð¾Ð¿ÑеделиÑÑ ÑаÑÑÑоÑние Ð¼ÐµÐ¶Ð´Ñ Ð²Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñми лекÑем.
12.4.2. ÐбÑабоÑка запÑоÑов
Ð ÐодÑазделе 12.3.2 показÑвалоÑÑ, как обÑÑнÑе ÑекÑÑовÑе запÑоÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ пÑеобÑазовÑваÑÑ Ð² знаÑÐµÐ½Ð¸Ñ tsquery. Postgres Pro пÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ Ñакже Ð½Ð°Ð±Ð¾Ñ ÑÑнкÑий и опеÑаÑоÑов Ð´Ð»Ñ Ð¾Ð±ÑабоÑки запÑоÑов, Ñже пÑедÑÑавленнÑÑ
в ÑоÑмаÑе tsquery.
-
tsquery&&tsquery ÐозвÑаÑÐ°ÐµÑ Ð»Ð¾Ð³Ð¸ÑеÑкое пÑоизведение (AND) двÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð·Ð°Ð¿ÑоÑов.
-
tsquery||tsquery ÐозвÑаÑÐ°ÐµÑ Ð»Ð¾Ð³Ð¸ÑеÑкое обÑединение (OR) двÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð·Ð°Ð¿ÑоÑов.
-
!!tsquery ÐозвÑаÑÐ°ÐµÑ Ð»Ð¾Ð³Ð¸ÑеÑкое оÑÑиÑание (NOT) данного запÑоÑа.
-
tsquery<->tsquery ÐозвÑаÑÐ°ÐµÑ ÑÑазовое обÑединение двÑÑ ÑказаннÑÑ Ð·Ð°Ð¿ÑоÑов.
SELECT to_tsquery('fat') <-> to_tsquery('cat | rat'); ?column? ----------------------------------- 'fat' <-> 'cat' | 'fat' <-> 'rat'-
tsquery_phrase(запÑоÑ1tsquery,запÑоÑ2tsquery[,ÑаÑÑÑоÑниеinteger]) returnstsquery ÐозвÑаÑÐ°ÐµÑ Ð·Ð°Ð¿ÑоÑ, коÑоÑÑй иÑÐµÑ ÑооÑвеÑÑÑвие пеÑÐ²Ð¾Ð¼Ñ Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð·Ð°Ð¿ÑоÑÑ, за коÑоÑÑм ÑледÑÐµÑ ÑооÑвеÑÑÑвие вÑоÑÐ¾Ð¼Ñ Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð·Ð°Ð¿ÑоÑÑ (ÑиÑло лекÑем Ð¼ÐµÐ¶Ð´Ñ Ð½Ð¸Ð¼Ð¸ задаÑÑÑÑ Ð¿Ð°ÑамеÑÑом
ÑаÑÑÑоÑние), Ñ Ð¿Ñименением опеÑаÑоÑа<ÑипаN>tsquery. ÐапÑимеÑ:SELECT tsquery_phrase(to_tsquery('fat'), to_tsquery('cat'), 10); tsquery_phrase ------------------ 'fat' <10> 'cat'-
setweight(запÑоÑtsquery,веÑ"char") returnstsquery ФÑнкÑиÑ
setweightвозвÑаÑÐ°ÐµÑ ÐºÐ¾Ð¿Ð¸Ñ Ð²Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ запÑоÑа, пÑиÑÐ²Ð°Ð¸Ð²Ð°Ñ Ð¿Ð¾Ð·Ð¸ÑиÑм заданнÑйвеÑ(а):A,B,C,Dили Ð¸Ñ ÑоÑеÑание. ÐÑи меÑки ÑÐ¾Ñ ÑанÑÑÑÑÑ Ð¿Ñи конкаÑенаÑии запÑоÑов, ÑÑо позволÑÐµÑ Ð¿ÑидаваÑÑ ÑазнÑе веÑа Ñловам из ÑазнÑÑ ÑаÑÑей докÑменÑа и, как ÑледÑÑвие, ÑанжиÑоваÑÑ Ð¸Ñ Ð¿Ð¾-ÑазномÑ.ÐамеÑÑÑе, ÑÑо веÑа назнаÑаÑÑÑÑ Ð¿Ð¾Ð·Ð¸ÑиÑм, а не лекÑемам. ÐÑли Ð²Ñ Ð¾Ð´Ð½Ð¾Ð¹ запÑÐ¾Ñ Ð¾ÑиÑен Ð¾Ñ Ð¿Ð¾Ð·Ð¸Ñионной инÑоÑмаÑии,
setweightне Ð´ÐµÐ»Ð°ÐµÑ Ð½Ð¸Ñего.-
numnode(запÑоÑtsquery) returnsinteger ÐозвÑаÑÐ°ÐµÑ ÑиÑло Ñзлов (лекÑем и опеÑаÑоÑов) в знаÑении
tsquery. ÐÑа ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ Ð¾Ð¿ÑеделиÑÑ, Ð¸Ð¼ÐµÐµÑ Ð»Ð¸ ÑмÑÑлзапÑоÑ(Ñогда ÐµÑ ÑезÑлÑÑÐ°Ñ > 0) или он ÑодеÑÐ¶Ð¸Ñ ÑолÑко ÑÑоп-Ñлова (Ñогда она возвÑаÑÐ°ÐµÑ 0). ÐÑимеÑÑ:SELECT numnode(plainto_tsquery('the any')); ÐÐÐÐЧÐÐÐÐ: запÑÐ¾Ñ Ð¿Ð¾Ð¸Ñка ÑекÑÑа игноÑиÑÑеÑÑÑ, Ñак как ÑодеÑÐ¶Ð¸Ñ ÑолÑко ÑÑоп-Ñлова или не ÑодеÑÐ¶Ð¸Ñ Ð»ÐµÐºÑем numnode --------- 0 SELECT numnode('foo & bar'::tsquery); numnode --------- 3-
querytree(запÑоÑtsquery) returnstext ÐозвÑаÑÐ°ÐµÑ ÑаÑÑÑ
tsquery, коÑоÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка по индекÑÑ. ÐÑа ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ Ð²ÑÑвиÑÑ Ð½ÐµÐ¸Ð½Ð´ÐµÐºÑиÑÑемÑе запÑоÑÑ, напÑимеÑ, Ñакие, коÑоÑÑе ÑодеÑÐ¶Ð°Ñ ÑолÑко ÑÑоп-Ñлова или ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¾ÑÑиÑаниÑ. ÐапÑимеÑ:SELECT querytree(to_tsquery('!defined')); querytree -----------
12.4.2.1. ÐеÑезапиÑÑ Ð·Ð°Ð¿ÑоÑов
СемейÑÑво запÑоÑов ts_rewrite иÑÐµÑ Ð² данном tsquery вÑ
Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ñелевого подзапÑоÑа и заменÑÐµÑ ÐºÐ°Ð¶Ð´Ð¾Ðµ вÑ
ождение Ñказанной подÑÑановкой. Ðо ÑÑÑи ÑÑа опеÑаÑÐ¸Ñ Ð¿Ð¾Ñ
ожа на Ð·Ð°Ð¼ÐµÐ½Ñ Ð¿Ð¾Ð´ÑÑÑоки в ÑÑÑоке, ÑолÑко ÑаÑÑÑиÑана на ÑабоÑÑ Ñ tsquery. СоÑеÑание Ñелевого подзапÑоÑа Ñ Ð¿Ð¾Ð´ÑÑановкой можно ÑÑиÑаÑÑ Ð¿Ñавилом пеÑезапиÑи запÑоÑа. ÐÐ°Ð±Ð¾Ñ ÑакиÑ
пÑавил пеÑезапиÑи Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾ÑÐµÐ½Ñ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½ пÑи поиÑке. ÐапÑимеÑ, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑлÑÑÑиÑÑ ÑезÑлÑÑаÑÑ, добавив ÑÐ¸Ð½Ð¾Ð½Ð¸Ð¼Ñ (напÑимеÑ, big apple, nyc и gotham Ð´Ð»Ñ new york) или ÑÑзиÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¿Ð¾Ð¸Ñка, ÑÑÐ¾Ð±Ñ Ð½Ð°ÑелиÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð½Ð° некоÑоÑÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ. ÐÑо в некоÑоÑом ÑмÑÑле пеÑеÑекаеÑÑÑ Ñ ÑÑнкÑионалÑноÑÑÑÑ ÑезаÑÑÑÑов (ÐодÑаздел 12.6.4). Ðднако, пÑи Ñаком подÑ
оде Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе изменÑÑÑ Ð¿Ñавила пеÑезапиÑи «на леÑÑ», Ñогда как пÑи обновлении ÑезаÑÑÑÑа необÑ
одима пеÑеиндекÑаÑиÑ.
-
ts_rewrite (запÑоÑtsquery,ÑелÑtsquery,заменаtsquery) returnstsquery ÐÑа ÑоÑма
ts_rewriteпÑоÑÑо пÑименÑÐµÑ Ð¾Ð´Ð½Ð¾ пÑавило пеÑезапиÑи:ÑелÑзаменÑеÑÑÑподÑÑановкойвезде, где она Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð²Ð·Ð°Ð¿ÑоÑе. ÐапÑимеÑ:SELECT ts_rewrite('a & b'::tsquery, 'a'::tsquery, 'c'::tsquery); ts_rewrite ------------ 'b' & 'c'-
ts_rewrite (запÑоÑtsquery,вÑбоÑкаtext) returnstsquery ÐÑа ÑоÑма
ts_rewriteпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð½Ð°ÑалÑнÑйзапÑоÑи SQL-командÑselect, коÑоÑÐ°Ñ Ð·Ð°Ð´Ð°ÑÑÑÑ ÑекÑÑовой ÑÑÑокой. Ðомандаselectдолжна вÑдаваÑÑ Ð´Ð²Ð° ÑÑолбÑа Ñипаtsquery. ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки ÑезÑлÑÑаÑаselectÐ²Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¿ÐµÑвого ÑÑолбÑа (Ñели) заменÑÑÑÑÑ Ð·Ð½Ð°ÑениÑми вÑоÑого ÑÑолбÑа (подÑÑановкой) в ÑекÑÑезапÑоÑа. ÐапÑимеÑ:CREATE TABLE aliases (t tsquery PRIMARY KEY, s tsquery); INSERT INTO aliases VALUES('a', 'c'); SELECT ts_rewrite('a & b'::tsquery, 'SELECT t,s FROM aliases'); ts_rewrite ------------ 'b' & 'c'ÐамеÑÑÑе, ÑÑо когда Ñаким ÑпоÑобом пÑименÑÑÑÑÑ Ð½ÐµÑколÑко пÑавил пеÑезапиÑи, поÑÑдок Ð¸Ñ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ð·Ð½Ð°Ñение, поÑÑÐ¾Ð¼Ñ Ð² иÑÑ Ð¾Ð´Ð½Ð¾Ð¼ запÑоÑе ÑледÑÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ
ORDER BYпо какомÑ-либо клÑÑÑ.
ÐавайÑе ÑаÑÑмоÑÑим пÑакÑиÑеÑкий пÑÐ¸Ð¼ÐµÑ Ð½Ð° ÑÐµÐ¼Ñ Ð°ÑÑÑономии. ÐÑ ÑазвеÑнÑм запÑÐ¾Ñ supernovae, иÑполÑзÑÑ Ð¿Ñавила пеÑезапиÑи в ÑаблиÑе:
CREATE TABLE aliases (t tsquery primary key, s tsquery);
INSERT INTO aliases VALUES(to_tsquery('supernovae'),
to_tsquery('supernovae|sn'));
SELECT ts_rewrite(to_tsquery('supernovae & crab'), 'SELECT * FROM aliases');
ts_rewrite
---------------------------------
'crab' & ( 'supernova' | 'sn' )
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ ÑкоÑÑекÑиÑоваÑÑ Ð¿Ñавила пеÑезапиÑи, пÑоÑÑо изменив ÑаблиÑÑ:
UPDATE aliases
SET s = to_tsquery('supernovae|sn & !nebulae')
WHERE t = to_tsquery('supernovae');
SELECT ts_rewrite(to_tsquery('supernovae & crab'), 'SELECT * FROM aliases');
ts_rewrite
---------------------------------------------
'crab' & ( 'supernova' | 'sn' & !'nebula' )
ÐеÑезапиÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾Ð¹, когда задано много пÑавил пеÑезапиÑи, Ñак как ÑооÑвеÑÑÑÐ²Ð¸Ñ Ð±ÑдÑÑ Ð¿ÑовеÑÑÑÑÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ пÑавила. ЧÑÐ¾Ð±Ñ Ð¾ÑÑилÑÑÑоваÑÑ Ñвно неподÑ
одÑÑие пÑавила, можно иÑполÑзоваÑÑ Ð¿ÑовеÑки вклÑÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñипа tsquery. Ð ÑледÑÑÑем пÑимеÑе вÑбиÑаÑÑÑÑ ÑолÑко Ñе пÑавила, коÑоÑÑе могÑÑ ÑооÑвеÑÑÑвоваÑÑ Ð¸ÑÑ
Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð·Ð°Ð¿ÑоÑÑ:
SELECT ts_rewrite('a & b'::tsquery,
'SELECT t,s FROM aliases WHERE ''a & b''::tsquery @> t');
ts_rewrite
------------
'b' & 'c'
12.4.3. ТÑиггеÑÑ Ð´Ð»Ñ Ð°Ð²ÑомаÑиÑеÑкого обновлениÑ
Ðогда пÑедÑÑавление докÑменÑа в ÑоÑмаÑе tsvector Ñ
ÑаниÑÑÑ Ð² оÑделÑном ÑÑолбÑе, необÑ
одимо ÑоздаÑÑ ÑÑиггеÑ, коÑоÑÑй бÑÐ´ÐµÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÑÑÑ ÐµÐ³Ð¾ ÑодеÑжимое пÑи изменении ÑÑолбÑов, из коÑоÑÑÑ
ÑоÑÑавлÑеÑÑÑ Ð¸ÑÑ
однÑй докÑменÑ. ÐÐ»Ñ ÑÑого можно иÑполÑзоваÑÑ Ð´Ð²Ðµ вÑÑÑоеннÑе ÑÑиггеÑнÑе ÑÑнкÑии или напиÑаÑÑ Ñвои ÑобÑÑвеннÑе.
tsvector_update_trigger(ÑÑолбеÑ_tsvector,имÑ_конÑигÑÑаÑии,ÑÑолбеÑ_ÑекÑÑа[, ...]) tsvector_update_trigger_column(ÑÑолбеÑ_tsvector,ÑÑолбеÑ_конÑигÑÑаÑии,ÑÑолбеÑ_ÑекÑÑа[, ...])
ÐÑи ÑÑиггеÑнÑе ÑÑнкÑии авÑомаÑиÑеÑки вÑÑиÑлÑÑÑ Ð·Ð½Ð°Ñение Ð´Ð»Ñ ÑÑолбÑа tsvector из одного или неÑколÑкиÑ
ÑекÑÑовÑÑ
ÑÑолбÑов Ñ Ð¿Ð°ÑамеÑÑами, ÑказаннÑми в команде CREATE TRIGGER. ÐÑÐ¸Ð¼ÐµÑ Ð¸Ñ
иÑполÑзованиÑ:
CREATE TABLE messages (
title text,
body text,
tsv tsvector
);
CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
ON messages FOR EACH ROW EXECUTE PROCEDURE
tsvector_update_trigger(tsv, 'pg_catalog.english', title, body);
INSERT INTO messages VALUES('title here', 'the body text is here');
SELECT * FROM messages;
title | body | tsv
------------+-----------------------+----------------------------
title here | the body text is here | 'bodi':4 'text':5 'titl':1
SELECT title, body FROM messages WHERE tsv @@ to_tsquery('title & body');
title | body
------------+-----------------------
title here | the body text is here
С Ñаким ÑÑиггеÑом лÑбое изменение в полÑÑ
title или body бÑÐ´ÐµÑ Ð°Ð²ÑомаÑиÑеÑки оÑÑажаÑÑÑÑ Ð² ÑодеÑжимом tsv, Ñак ÑÑо пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ пÑидÑÑÑÑ Ð·Ð°Ð½Ð¸Ð¼Ð°ÑÑÑÑ ÑÑим.
ÐеÑвÑм аÑгÑменÑом ÑÑиÑ
ÑÑнкÑий должно бÑÑÑ Ð¸Ð¼Ñ ÑÑолбÑа tsvector, ÑодеÑжимое коÑоÑого бÑÐ´ÐµÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÑÑÑÑÑ. ÐÑÑ Ð¾Ð´Ð¸Ð½ аÑгÑÐ¼ÐµÐ½Ñ â конÑигÑÑаÑÐ¸Ñ ÑекÑÑового поиÑка, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ð¿ÑеобÑазованиÑ. ÐÐ»Ñ tsvector_update_trigger Ð¸Ð¼Ñ ÐºÐ¾Ð½ÑигÑÑаÑии пеÑедаÑÑÑÑ Ð¿ÑоÑÑо как вÑоÑой аÑгÑÐ¼ÐµÐ½Ñ ÑÑиггеÑа. ÐÑо Ð¸Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ бÑÑÑ Ð¾Ð¿Ñеделено полноÑÑÑÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ ÑÑиггеÑа не менÑлоÑÑ Ð¿Ñи изменениÑÑ
в пÑÑи поиÑка (search_path). ÐÐ»Ñ tsvector_update_trigger_column во вÑоÑом аÑгÑменÑе ÑÑиггеÑа пеÑедаÑÑÑÑ Ð¸Ð¼Ñ Ð´ÑÑгого ÑÑолбÑа ÑаблиÑÑ, коÑоÑÑй должен имеÑÑ Ñип regconfig. ÐÑо позволÑÐµÑ Ð¸ÑполÑзоваÑÑ ÑазнÑе конÑигÑÑаÑии Ð´Ð»Ñ ÑазнÑÑ
ÑÑÑок. РоÑÑавÑиÑ
ÑÑ Ð°ÑгÑменÑаÑ
пеÑедаÑÑÑÑ Ð¸Ð¼ÐµÐ½Ð° ÑекÑÑовÑÑ
ÑÑолбÑов (Ñипа text, varchar или char). ÐÑ
ÑодеÑжимое бÑÐ´ÐµÑ Ð²ÐºÐ»ÑÑено в докÑÐ¼ÐµÐ½Ñ Ð² заданном поÑÑдке. ÐÑи ÑÑом знаÑÐµÐ½Ð¸Ñ NULL бÑдÑÑ Ð¿ÑопÑÑÐµÐ½Ñ (а дÑÑгие ÑÑолбÑÑ Ð±ÑдÑÑ Ð¸Ð½Ð´ÐµÐºÑиÑоваÑÑÑÑ).
ÐгÑаниÑение ÑÑÐ¸Ñ Ð²ÑÑÑоеннÑÑ ÑÑиггеÑов заклÑÑаеÑÑÑ Ð² Ñом, ÑÑо они обÑабаÑÑваÑÑ Ð²Ñе ÑÑолбÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾. ЧÑÐ¾Ð±Ñ ÑÑолбÑÑ Ð¾Ð±ÑабаÑÑвалиÑÑ Ð¿Ð¾-ÑазномÑ, напÑÐ¸Ð¼ÐµÑ Ð´Ð»Ñ ÑекÑÑа заголовка задавалÑÑ Ð½Ðµ ÑÐ¾Ñ Ð¶Ðµ веÑ, ÑÑо Ð´Ð»Ñ Ñела докÑменÑа, поÑÑебÑеÑÑÑ ÑазÑабоÑаÑÑ Ñвой ÑÑиггеÑ. РпÑимеÑÑ, Ñак ÑÑо можно ÑделаÑÑ Ð½Ð° ÑзÑке PL/pgSQL:
CREATE FUNCTION messages_trigger() RETURNS trigger AS $$
begin
new.tsv :=
setweight(to_tsvector('pg_catalog.english', coalesce(new.title,'')),
'A') ||
setweight(to_tsvector('pg_catalog.english', coalesce(new.body,'')),
'D');
return new;
end
$$ LANGUAGE plpgsql;
CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
ON messages FOR EACH ROW EXECUTE PROCEDURE messages_trigger();ÐомниÑе, ÑÑо, ÑÐ¾Ð·Ð´Ð°Ð²Ð°Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ tsvector в ÑÑиггеÑаÑ
, важно Ñвно ÑказÑваÑÑ Ð¸Ð¼Ñ ÐºÐ¾Ð½ÑигÑÑаÑии, ÑÑÐ¾Ð±Ñ ÑодеÑжимое ÑÑолбÑа не завиÑело Ð¾Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ default_text_search_config. РпÑоÑивном ÑлÑÑае могÑÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÑÑÑ Ð¿ÑоблемÑ, напÑÐ¸Ð¼ÐµÑ ÑезÑлÑÑаÑÑ Ð¿Ð¾Ð¸Ñка изменÑÑÑÑ Ð¿Ð¾Ñле вÑгÑÑзки и воÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
.
12.4.4. Ð¡Ð±Ð¾Ñ ÑÑаÑиÑÑики по докÑменÑÑ
ФÑнкÑÐ¸Ñ ts_stat Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð° Ð´Ð»Ñ Ð¿ÑовеÑки конÑигÑÑаÑии и наÑ
Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½ÑÑ
ÑÑоп-Ñлов.
ts_stat(sql_запÑоÑtext, [веÑаtext,] OUTÑловоtext, OUTÑиÑло_докinteger, OUTÑиÑло_Ð²Ñ Ð¾Ð¶Ð´integer) returnssetof record
ÐдеÑÑ sql_запÑÐ¾Ñ â ÑекÑÑÐ¾Ð²Ð°Ñ ÑÑÑока, ÑодеÑжаÑÐ°Ñ SQL-запÑоÑ, коÑоÑÑй должен возвÑаÑаÑÑ Ð¾Ð´Ð¸Ð½ ÑÑÐ¾Ð»Ð±ÐµÑ tsvector. ФÑнкÑÐ¸Ñ ts_stat вÑполнÑÐµÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð¸ возвÑаÑÐ°ÐµÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð¿Ð¾ каждой оÑделÑной лекÑеме (ÑловÑ), ÑодеÑжаÑейÑÑ Ð² даннÑÑ
tsvector. ÐÑ ÑезÑлÑÑÐ°Ñ Ð¿ÑедÑÑавлÑеÑÑÑ Ð² ÑÑолбÑаÑ
Ñловоtextâ знаÑение лекÑемÑÑиÑло_докintegerâ ÑиÑло докÑменÑов (знаÑенийtsvector), в коÑоÑÑÑ Ð²ÑÑÑеÑилоÑÑ ÑловоÑиÑло_Ð²Ñ Ð¾Ð¶Ð´integerâ обÑее ÑиÑло Ð²Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ð¹ Ñлова
ÐÑли пеÑедаÑÑÑÑ Ð¿Ð°ÑамеÑÑ weights, Ñо подÑÑиÑÑваÑÑÑÑ ÑолÑко вÑ
Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ñ ÑказаннÑми в нÑм веÑами.
ÐапÑимеÑ, найÑи деÑÑÑÑ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ ÑаÑÑо иÑполÑзÑемÑÑ Ñлов в коллекÑии докÑменÑов можно Ñак:
SELECT * FROM ts_stat('SELECT vector FROM apod')
ORDER BY nentry DESC, ndoc DESC, word
LIMIT 10; СледÑÑÑий запÑÐ¾Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ñоже деÑÑÑÑ Ñлов, но пÑи вÑбоÑе иÑ
ÑÑиÑÑваÑÑÑÑ ÑолÑко вÑ
Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ñ Ð²ÐµÑами A или B:
SELECT * FROM ts_stat('SELECT vector FROM apod', 'ab')
ORDER BY nentry DESC, ndoc DESC, word
LIMIT 10;