12.3. УпÑавление ÑекÑÑовÑм поиÑком
ÐÐ»Ñ ÑеализаÑии полноÑекÑÑового поиÑка необÑ
Ð¾Ð´Ð¸Ð¼Ñ ÑÑнкÑии, позволÑÑÑие ÑоздаÑÑ tsvector из докÑменÑа и tsquery из запÑоÑа полÑзоваÑелÑ. ÐÑоме Ñого, ÑезÑлÑÑаÑÑ Ð½Ñжно вÑдаваÑÑ Ð² Ñдобном поÑÑдке, Ñак ÑÑо нам поÑÑебÑеÑÑÑ ÑÑнкÑиÑ, оÑениваÑÑÐ°Ñ ÑелеванÑноÑÑÑ Ð´Ð¾ÐºÑменÑа Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ запÑоÑа. Ðажно Ñакже имеÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð²ÑводиÑÑ Ð½Ð°Ð¹Ð´ÐµÐ½Ð½Ñй ÑекÑÑ Ð¿Ð¾Ð´Ñ
одÑÑим обÑазом. Ð Postgres Pro еÑÑÑ Ð²Ñе необÑ
одимÑе Ð´Ð»Ñ ÑÑого ÑÑнкÑии.
12.3.1. Ð Ð°Ð·Ð±Ð¾Ñ Ð´Ð¾ÐºÑменÑов
ÐÐ»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾ÐºÑменÑа в Ñип tsvector Postgres Pro пÑедоÑÑавлÑÐµÑ ÑÑнкÑÐ¸Ñ to_tsvector.
to_tsvector([конÑигÑÑаÑиÑregconfig,]докÑменÑtext) returnstsvector
to_tsvector ÑазбиÑÐ°ÐµÑ ÑекÑÑовÑй докÑÐ¼ÐµÐ½Ñ Ð½Ð° ÑÑагменÑÑ, ÑÐ²Ð¾Ð´Ð¸Ñ ÑÑагменÑÑ Ðº лекÑемам и возвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение tsvector, в коÑоÑом пеÑеÑиÑлÑÑÑÑÑ Ð»ÐµÐºÑÐµÐ¼Ñ Ð¸ иÑ
позиÑии в докÑменÑе. ÐÑи обÑабоÑке докÑменÑа иÑполÑзÑеÑÑÑ ÑÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ ÐºÐ¾Ð½ÑигÑÑаÑÐ¸Ñ ÑекÑÑового поиÑка или конÑигÑÑаÑÐ¸Ñ Ð¿Ð¾ ÑмолÑаниÑ. ÐÑоÑÑой пÑимеÑ:
SELECT to_tsvector('english', 'a fat cat sat on a mat - it ate a fat rats');
to_tsvector
-----------------------------------------------------
'ate':9 'cat':3 'fat':2,11 'mat':7 'rat':12 'sat':4
Ð ÑÑом пÑимеÑе Ð¼Ñ Ð²Ð¸Ð´Ð¸Ð¼, ÑÑо ÑезÑлÑÑиÑÑÑÑий tsvector не ÑодеÑÐ¶Ð¸Ñ Ñлова a, on и it, Ñлово rats пÑевÑаÑилоÑÑ rat, а знак пÑÐµÐ¿Ð¸Ð½Ð°Ð½Ð¸Ñ Â«-» бÑл пÑоигноÑиÑован.
ФÑнкÑÐ¸Ñ to_tsvector внÑÑÑи вÑзÑÐ²Ð°ÐµÑ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°ÑоÑ, коÑоÑÑй ÑÐ°Ð·Ð±Ð¸Ð²Ð°ÐµÑ ÑекÑÑ Ð´Ð¾ÐºÑменÑа на ÑÑагменÑÑ Ð¸ клаÑÑиÑиÑиÑÑÐµÑ Ð¸Ñ
. ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑÑагменÑа она пÑовеÑÑÐµÑ ÑпиÑок ÑловаÑей (Раздел 12.6), опÑеделÑемÑй Ñипом ÑÑагменÑа. ÐеÑвÑй же ÑловаÑÑ, ÑаÑпознавÑий ÑÑагменÑ, вÑдаÑÑ Ð¾Ð´Ð½Ñ Ð¸Ð»Ð¸ неÑколÑко пÑедÑÑавлÑÑÑиÑ
его лекÑем. ÐапÑимеÑ, rats пÑевÑаÑаеÑÑÑ Ð² rat, Ñак как один из ÑловаÑей понимаеÑ, ÑÑо Ñлово rats â ÑÑо Ñлово rat во множеÑÑвенном ÑиÑле. ÐекоÑоÑое Ñлова ÑаÑпознаÑÑÑÑ ÐºÐ°Ðº ÑÑоп-Ñлова (ÐодÑаздел 12.6.1) и игноÑиÑÑÑÑÑÑ ÐºÐ°Ðº Ñлова, ÑигÑÑиÑÑÑÑие в ÑекÑÑе наÑÑолÑко ÑаÑÑо, ÑÑо иÑкаÑÑ Ð¸Ñ
беÑÑмÑÑленно. РнаÑем пÑимеÑе ÑÑо a, on и it. ÐÑли ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ Ð½Ðµ воÑпÑинимаеÑÑÑ Ð½Ð¸ одним ÑловаÑÑм из ÑпиÑка, он Ñак же игноÑиÑÑеÑÑÑ. Рданном пÑимеÑе ÑÑо пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ñо знаком пÑÐµÐ¿Ð¸Ð½Ð°Ð½Ð¸Ñ -, Ñак как Ñ Ñаким Ñипом ÑÑагменÑа (ÑимволÑ-ÑазделиÑели) не ÑвÑзан никакой ÑловаÑÑ Ð¸ знаÑÐ¸Ñ Ñакие ÑÑагменÑÑ Ð½Ð¸ÐºÐ¾Ð³Ð´Ð° не бÑдÑÑ Ð¸Ð½Ð´ÐµÐºÑиÑоваÑÑÑÑ. ÐÑÐ±Ð¾Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°ÑоÑа, ÑловаÑей и индекÑиÑÑемÑÑ
Ñипов ÑÑагменÑов опÑеделÑеÑÑÑ ÐºÐ¾Ð½ÑигÑÑаÑией ÑекÑÑового поиÑка (Раздел 12.7). Родной базе даннÑÑ
можно иÑполÑзоваÑÑ ÑазнÑе конÑигÑÑаÑии, в Ñом ÑиÑле, пÑедопÑеделÑннÑе конÑигÑÑаÑии Ð´Ð»Ñ ÑазнÑÑ
ÑзÑков. РнаÑем пÑимеÑе Ð¼Ñ Ð¸ÑполÑзовали конÑигÑÑаÑÐ¸Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ð°Ð½Ð³Ð»Ð¸Ð¹Ñкого ÑзÑка â english.
ÐÐ»Ñ Ð½Ð°Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑлеменÑам tsvector ÑазнÑÑ
веÑов иÑполÑзÑеÑÑÑ ÑÑнкÑÐ¸Ñ setweight. ÐÐµÑ ÑлеменÑа задаÑÑÑÑ Ð±Ñквой A, B, C или D. ÐбÑÑно ÑÑо пÑименÑеÑÑÑ Ð´Ð»Ñ Ð¾Ð±Ð¾Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð²Ð°Ð¶Ð½Ð¾ÑÑи Ñлов в ÑазнÑÑ
ÑаÑÑÑÑ
докÑменÑа, напÑÐ¸Ð¼ÐµÑ Ð² заголовке или в Ñеле докÑменÑа. ÐаÑем ÑÑа инÑоÑмаÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð¿Ñи ÑанжиÑовании ÑезÑлÑÑаÑов поиÑка.
Так как to_tsvector(NULL) веÑнÑÑ NULL, Ð¼Ñ ÑовеÑÑем иÑполÑзоваÑÑ coalesce везде, где ÑооÑвеÑÑÑвÑÑÑее поле Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ NULL. СоздаваÑÑ tsvector из ÑÑÑÑкÑÑÑиÑованного докÑменÑа ÑекомендÑеÑÑÑ Ñак:
UPDATE tt SET ti =
setweight(to_tsvector(coalesce(title,'')), 'A') ||
setweight(to_tsvector(coalesce(keyword,'')), 'B') ||
setweight(to_tsvector(coalesce(abstract,'')), 'C') ||
setweight(to_tsvector(coalesce(body,'')), 'D'); ÐдеÑÑ Ð¼Ñ Ð¸ÑполÑзовали setweight Ð´Ð»Ñ Ð¿Ð¾Ð¼ÐµÑки пÑоиÑÑ
Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ лекÑÐµÐ¼Ñ Ð² ÑÑоÑмиÑованнÑÑ
знаÑениÑÑ
tsvector и обÑединили помеÑеннÑе знаÑÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑа конкаÑенаÑии Ñипов tsvector ||. (ÐодÑобнее ÑÑи опеÑаÑии ÑаÑÑмаÑÑиваÑÑÑÑ Ð² ÐодÑазделе 12.4.1.)
12.3.2. Ð Ð°Ð·Ð±Ð¾Ñ Ð·Ð°Ð¿ÑоÑов
Postgres Pro пÑедоÑÑавлÑÐµÑ ÑÑнкÑии to_tsquery, plainto_tsquery и phraseto_tsquery Ð´Ð»Ñ Ð¿ÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа к ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
tsquery. ФÑнкÑÐ¸Ñ to_tsquery даÑÑ Ð±Ð¾Ð»ÑÑе возможноÑÑей, Ñем plainto_tsquery и phraseto_tsquery, но более ÑÑÑога к вÑ
Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð·Ð°Ð¿ÑоÑÑ.
to_tsquery([конÑигÑÑаÑиÑregconfig,]ÑекÑÑ_запÑоÑаtext) returnstsquery
to_tsquery ÑоздаÑÑ Ð·Ð½Ð°Ñение tsquery из ÑекÑÑа_запÑоÑа, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ ÑоÑÑоÑÑÑ Ð¸Ð· пÑоÑÑÑÑ
ÑÑагменÑов, ÑазделÑннÑÑ
логиÑеÑкими опеÑаÑоÑами & (Ð), | (ÐÐÐ), ! (ÐÐ), а Ñакже опеÑаÑоÑами поиÑка ÑÑаз <-> (ÐÐ ÐÐШÐСТÐУÐТ). ÐÑи опеÑаÑоÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð·Ð°ÐºÐ»ÑÑÐµÐ½Ñ Ð² Ñкобки. ÐÑÑгими Ñловами, вÑ
одное знаÑение Ð´Ð»Ñ to_tsquery должно Ñже ÑооÑвеÑÑÑвоваÑÑ Ð¾Ð±Ñим пÑавилам Ð´Ð»Ñ Ð·Ð½Ð°Ñений tsquery, опиÑаннÑм в Разделе 8.11. РазлиÑие иÑ
ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо во вводимом в tsquery знаÑении ÑÑагменÑÑ Ð²Ð¾ÑпÑинимаÑÑÑÑ Ð±ÑквалÑно, Ñогда как to_tsquery ноÑмализÑÐµÑ ÑÑагменÑÑ, пÑÐ¸Ð²Ð¾Ð´Ñ Ð¸Ñ
к лекÑемам, иÑполÑзÑÑ Ñвно ÑказаннÑÑ Ð¸Ð»Ð¸ подÑазÑмеваемÑÑ ÐºÐ¾Ð½ÑигÑÑаÑиÑ, и оÑбÑаÑÑÐ²Ð°Ñ ÑÑоп-Ñлова. ÐапÑимеÑ:
SELECT to_tsquery('english', 'The & Fat & Rats');
to_tsquery
---------------
'fat' & 'rat'
Ðак и пÑи вводе знаÑÐµÐ½Ð¸Ñ tsquery, Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ лекÑÐµÐ¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ задаÑÑ Ð²ÐµÑ, ÑÑÐ¾Ð±Ñ Ð¿Ñи поиÑке можно бÑло вÑбÑаÑÑ Ð¸Ð· tsvector ÑолÑко лекÑÐµÐ¼Ñ Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñми веÑами. ÐапÑимеÑ:
SELECT to_tsquery('english', 'Fat | Rats:AB');
to_tsquery
------------------
'fat' | 'rat':AB
РлекÑеме Ñакже можно добавиÑÑ *, опÑеделив Ñаким обÑазом ÑÑловие поиÑка по пÑеÑикÑÑ:
SELECT to_tsquery('supern:*A & star:A*B');
to_tsquery
--------------------------
'supern':*A & 'star':*AB
Ð¢Ð°ÐºÐ°Ñ Ð»ÐµÐºÑема бÑÐ´ÐµÑ ÑооÑвеÑÑÑвоваÑÑ Ð»ÑÐ±Ð¾Ð¼Ñ ÑÐ»Ð¾Ð²Ñ Ð² tsvector, наÑинаÑÑемÑÑÑ Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ подÑÑÑоки.
to_tsquery Ð¼Ð¾Ð¶ÐµÑ Ñакже пÑинимаÑÑ ÑÑÐ°Ð·Ñ Ð² апоÑÑÑоÑаÑ
. ÐÑо полезно в оÑновном когда конÑигÑÑаÑÐ¸Ñ Ð²ÐºÐ»ÑÑÐ°ÐµÑ ÑезаÑÑÑÑ, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÑабаÑÑваÑÑ Ñакие ÑÑазÑ. Рпоказанном ниже пÑимеÑе пÑедполагаеÑÑÑ, ÑÑо ÑезаÑÑÑÑ ÑодеÑÐ¶Ð¸Ñ Ð¿Ñавило supernovae stars : sn:
SELECT to_tsquery('''supernovae stars'' & !crab');
to_tsquery
---------------
'sn' & !'crab'
ÐÑли ÑбÑаÑÑ ÑÑи апоÑÑÑоÑÑ, to_tsquery не пÑÐ¸Ð¼ÐµÑ ÑÑагменÑÑ, не ÑазделÑннÑе опеÑаÑоÑами AND и OR, и вÑдаÑÑ ÑинÑакÑиÑеÑкÑÑ Ð¾ÑибкÑ.
plainto_tsquery([конÑигÑÑаÑиÑregconfig,]ÑекÑÑ_запÑоÑаtext) returnstsquery
plainto_tsquery пÑеобÑазÑÐµÑ Ð½ÐµÑоÑмаÑиÑованнÑй ÑекÑÑ_запÑоÑа в знаÑение tsquery. ТекÑÑ ÑазбиÑаеÑÑÑ Ð¸ ноÑмализÑеÑÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾ ÑомÑ, как ÑÑо Ð´ÐµÐ»Ð°ÐµÑ to_tsvector, а заÑем Ð¼ÐµÐ¶Ð´Ñ Ð¾ÑÑавÑимиÑÑ Ñловами вÑÑавлÑÑÑÑÑ Ð»Ð¾Ð³Ð¸ÑеÑкие опеÑаÑоÑÑ & (AND).
ÐÑимеÑ:
SELECT plainto_tsquery('english', 'The Fat Rats');
plainto_tsquery
-----------------
'fat' & 'rat'
ÐамеÑÑÑе, ÑÑо plainto_tsquery не ÑаÑпознаÑÑ Ð²Ð¾ вÑ
одной ÑÑÑоке логиÑеÑкие опеÑаÑоÑÑ, опеÑаÑоÑÑ Ð¿Ð¾Ð¸Ñка ÑÑаз, меÑки веÑов или обознаÑÐµÐ½Ð¸Ñ Ð¿ÑеÑикÑов:
SELECT plainto_tsquery('english', 'The Fat & Rats:C');
plainto_tsquery
---------------------
'fat' & 'rat' & 'c'
Рданном ÑлÑÑае вÑе знаки пÑнкÑÑаÑии бÑли оÑбÑоÑÐµÐ½Ñ ÐºÐ°Ðº пÑобелÑнÑе ÑимволÑ.
phraseto_tsquery([конÑигÑÑаÑиÑregconfig,]ÑекÑÑ_запÑоÑаtext) returnstsquery
phraseto_tsquery ведÑÑ ÑÐµÐ±Ñ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾ plainto_tsquery, за иÑклÑÑением Ñого, ÑÑо она иÑполÑзÑÐµÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ <-> (ÐÐ ÐÐШÐСТÐУÐТ) вмеÑÑо бÑлевÑкого опеÑаÑоÑа & (Ð). ÐÑо оÑобенно полезно пÑи поиÑке ÑоÑнÑÑ
поÑледоваÑелÑноÑÑей лекÑем, Ñак как опеÑаÑÐ¾Ñ ÑÑазового поиÑка поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿Ð¾ÑÑдок лекÑем.
ÐапÑимеÑ:
SELECT phraseto_tsquery('english', 'The Fat Rats');
phraseto_tsquery
------------------
'fat' <-> 'rat'
Ðак и plainto_tsquery, phraseto_tsquery не ÑаÑпознаÑÑ Ð»Ð¾Ð³Ð¸ÑеÑкие и ÑÑазовÑе поиÑковÑе опеÑаÑоÑÑ, меÑки веÑа или меÑки пÑеÑикÑа в ÑвоиÑ
аÑгÑменÑаÑ
:
SELECT phraseto_tsquery('english', 'The Fat & Rats:C');
phraseto_tsquery
-----------------------------
'fat' <-> 'rat' <-> 'c'
Ðожно ÑказаÑÑ ÐºÐ¾Ð½ÑигÑÑаÑиÑ, иÑполÑзÑемÑÑ Ð´Ð»Ñ ÑазбоÑа докÑменÑа, напÑимеÑ, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ ÐºÐ¾Ð½ÑигÑÑаÑиÑ, иÑполÑзÑÑ ÑловаÑÑ hunspell (назовÑм ÐµÑ eng_hunspell) Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑ Ñлова в ÑазлиÑнÑÑ ÑоÑÐ¼Ð°Ñ :
SELECT phraseto_tsquery('eng_hunspell', 'developer of the building which collapsed');
phraseto_tsquery
--------------------------------------------------------------------------------------------
( 'developer' <3> 'building' ) <2> 'collapse' | ( 'developer' <3> 'build' ) <2> 'collapse'
12.3.3. РанжиÑование ÑезÑлÑÑаÑов поиÑка
РанжиÑование докÑменÑов можно пÑедÑÑавиÑÑ ÐºÐ°Ðº попÑÑÐºÑ Ð¾ÑениÑÑ, наÑколÑко они ÑелеванÑÐ½Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð·Ð°Ð¿ÑоÑÑ Ð¸ оÑÑоÑÑиÑоваÑÑ Ð¸Ñ Ñак, ÑÑÐ¾Ð±Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ ÑелеванÑнÑе вÑводилиÑÑ Ð¿ÐµÑвÑми. Ð Postgres Pro вÑÑÑÐ¾ÐµÐ½Ñ Ð´Ð²Ðµ ÑÑнкÑии ÑанжиÑованиÑ, пÑинимаÑÑие во внимание лекÑиÑеÑкÑÑ, позиÑионнÑÑ Ð¸ ÑÑÑÑкÑÑÑнÑÑ Ð¸Ð½ÑоÑмаÑиÑ; Ñо еÑÑÑ, они ÑÑиÑÑваÑÑ, наÑколÑко ÑаÑÑо и наÑколÑко близко вÑÑÑеÑаÑÑÑÑ Ð² докÑменÑе клÑÑевÑе Ñлова и какова важноÑÑÑ ÑодеÑжаÑей Ð¸Ñ ÑаÑÑи докÑменÑа. Ðднако Ñамо понÑÑие ÑелеванÑноÑÑи доволÑно ÑазмÑÑое и во многом опÑеделÑеÑÑÑ Ð¿Ñиложением. ÐÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¸ÑполÑзоваÑÑ Ð´Ð»Ñ ÑанжиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ дÑÑгÑÑ Ð¸Ð½ÑоÑмаÑиÑ, напÑимеÑ, вÑÐµÐ¼Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð¾ÐºÑменÑа. ÐÑÑÑоеннÑе ÑÑнкÑии ÑанжиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑаÑÑмаÑÑиваÑÑ Ð»Ð¸ÑÑ ÐºÐ°Ðº пÑимеÑÑ ÑеализаÑии. ÐÐ»Ñ ÑÐ²Ð¾Ð¸Ñ ÐºÐ¾Ð½ÐºÑеÑнÑÑ Ð·Ð°Ð´Ð°Ñ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑазÑабоÑаÑÑ ÑобÑÑвеннÑе ÑÑнкÑии ÑанжиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸/или ÑÑеÑÑÑ Ð¿Ñи обÑабоÑке Ð¸Ñ ÑезÑлÑÑаÑов дополниÑелÑнÑе ÑакÑоÑÑ.
Ðиже опиÑÐ°Ð½Ñ Ð´Ð²Ðµ вÑÑÑоеннÑе ÑÑнкÑии ÑанжиÑованиÑ:
-
ts_rank([веÑаfloat4[],]векÑоÑtsvector,запÑоÑtsquery[,ноÑмализаÑиÑinteger]) returnsfloat4 РанжиÑÑÐµÑ Ð²ÐµÐºÑоÑÑ Ð¿Ð¾ ÑаÑÑоÑе найденнÑÑ Ð»ÐµÐºÑем.
-
ts_rank_cd([веÑаfloat4[],]векÑоÑtsvector,запÑоÑtsquery[,ноÑмализаÑиÑinteger]) returnsfloat4 ÐÑа ÑÑнкÑÐ¸Ñ Ð²ÑÑиÑлÑÐµÑ Ð¿Ð»Ð¾ÑноÑÑÑ Ð¿Ð¾ÐºÑÑÑÐ¸Ñ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ векÑоÑа докÑменÑа и запÑоÑа, иÑполÑзÑÑ Ð¼ÐµÑод, ÑазÑабоÑаннÑй ÐлаÑком, ÐоÑмаком и Ð¢Ð°Ð´Ñ Ð¾Ñп и опиÑаннÑй в ÑÑаÑÑе "Relevance Ranking for One to Three Term Queries" в жÑÑнале "Information Processing and Management" в 1999 г. ÐлоÑноÑÑÑ Ð¿Ð¾ÐºÑÑÑÐ¸Ñ Ð²ÑÑиÑлÑеÑÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾ ÑангÑ
ts_rank, но в ÑаÑÑÑÑ Ð±ÐµÑÑÑÑÑ ÐµÑÑ Ð¸ близоÑÑÑ ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ Ð»ÐµÐºÑем дÑÑг к дÑÑгÑ.ÐÐ»Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ ÑезÑлÑÑаÑа ÑÑой ÑÑнкÑии ÑÑебÑеÑÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ позиÑии лекÑем. ÐоÑÑÐ¾Ð¼Ñ Ð¾Ð½Ð° игноÑиÑÑÑÑ Â«Ð¾ÑиÑеннÑе» Ð¾Ñ ÑÑой инÑоÑмаÑии лекÑÐµÐ¼Ñ Ð²
tsvector. ÐÑли во Ð²Ñ Ð¾Ð´Ð½ÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð½ÐµÑ Ð½ÐµÐ¾ÑиÑеннÑÑ Ð»ÐµÐºÑем, ÑезÑлÑÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ñавен нÑлÑ. (Ðа дополниÑелÑнÑми ÑведениÑми о ÑÑнкÑииstripи позиÑионной инÑоÑмаÑии в даннÑÑtsvectorобÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 12.4.1.)
ÐÐ»Ñ Ð¾Ð±ÐµÐ¸Ñ
ÑÑиÑ
ÑÑнкÑий аÑгÑÐ¼ÐµÐ½Ñ Ð²ÐµÑа позволÑÐµÑ Ð¿ÑидаÑÑ Ð±Ð¾Ð»ÑÑий или менÑÑий Ð²ÐµÑ Ñловам, в завиÑимоÑÑи Ð¾Ñ Ð¸Ñ
меÑок. РпеÑедаваемом маÑÑиве веÑов опÑеделÑеÑÑÑ, наÑколÑко веÑома ÐºÐ°Ð¶Ð´Ð°Ñ ÐºÐ°ÑегоÑÐ¸Ñ Ñлов, в ÑледÑÑÑем поÑÑдке:
{Ð²ÐµÑ D, Ð²ÐµÑ C, Ð²ÐµÑ B, Ð²ÐµÑ A}
ÐÑли ÑÑÐ¾Ñ Ð°ÑгÑÐ¼ÐµÐ½Ñ Ð¾Ð¿ÑÑкаеÑÑÑ, подÑазÑмеваÑÑÑÑ ÑледÑÑÑие знаÑениÑ:
{0.1, 0.2, 0.4, 1.0}ÐбÑÑно веÑами вÑделÑÑÑÑÑ Ñлова из оÑобÑÑ Ð¾Ð±Ð»Ð°ÑÑей докÑменÑа, напÑÐ¸Ð¼ÐµÑ Ð¸Ð· заголовка или кÑаÑкого введениÑ, Ñ Ñем, ÑÑÐ¾Ð±Ñ ÑÑи Ñлова ÑÑиÑалиÑÑ Ð±Ð¾Ð»ÐµÐµ и менее знаÑимÑми, Ñем Ñлова в оÑновном ÑекÑÑе докÑменÑа.
Так как веÑоÑÑноÑÑÑ Ð½Ð°Ð¹Ñи клÑÑевÑе Ñлова ÑвелиÑиваеÑÑÑ Ñ ÑазмеÑом докÑменÑа, пÑи ÑанжиÑовании Ð¸Ð¼ÐµÐµÑ ÑмÑÑл ÑÑиÑÑваÑÑ ÐµÐ³Ð¾, ÑÑобÑ, напÑимеÑ, докÑÐ¼ÐµÐ½Ñ Ñ ÑоÑней Ñлов, ÑодеÑжаÑий пÑÑÑ Ð²Ñ
ождений иÑкомÑÑ
Ñлов, ÑÑиÑалÑÑ Ð±Ð¾Ð»ÐµÐµ ÑелеванÑнÑм, Ñем докÑÐ¼ÐµÐ½Ñ Ñ ÑÑÑÑÑей Ñлов и Ñеми же пÑÑÑÑ Ð²Ñ
ождениÑми. Ðбе ÑÑнкÑии ÑанжиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑинимаÑÑ ÑелоÑиÑленнÑй паÑамеÑÑ Ð½Ð¾ÑмализаÑии, опÑеделÑÑÑий, как Ñанг докÑменÑа бÑÐ´ÐµÑ Ð·Ð°Ð²Ð¸ÑеÑÑ Ð¾Ñ ÐµÐ³Ð¾ ÑазмеÑа. ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¿ÑедÑÑавлÑÐµÑ Ñобой биÑовÑÑ Ð¼Ð°ÑÐºÑ Ð¸ ÑпÑавлÑÐµÑ Ð½ÐµÑколÑкими Ñежимами: Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе вклÑÑиÑÑ ÑÑÐ°Ð·Ñ Ð½ÐµÑколÑко Ñежимов, обÑединив знаÑÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑом | (напÑÐ¸Ð¼ÐµÑ Ñак: 2|4).
0 (по ÑмолÑаниÑ): длина докÑменÑа не ÑÑиÑÑваеÑÑÑ
1: Ñанг докÑменÑа делиÑÑÑ Ð½Ð° 1 + логаÑиÑм Ð´Ð»Ð¸Ð½Ñ Ð´Ð¾ÐºÑменÑа
2: Ñанг докÑменÑа делиÑÑÑ Ð½Ð° его длинÑ
4: Ñанг докÑменÑа делиÑÑÑ Ð½Ð° ÑÑеднее гаÑмониÑеÑкое ÑаÑÑÑоÑние Ð¼ÐµÐ¶Ð´Ñ Ð±Ð»Ð¾ÐºÐ°Ð¼Ð¸ (ÑÑо Ñеализовано ÑолÑко в
ts_rank_cd)8: Ñанг докÑменÑа делиÑÑÑ Ð½Ð° ÑиÑло ÑникалÑнÑÑ Ñлов в докÑменÑе
16: Ñанг докÑменÑа делиÑÑÑ Ð½Ð° 1 + логаÑиÑм ÑиÑла ÑникалÑнÑÑ Ñлов в докÑменÑе
32: Ñанг делиÑÑÑ ÑÐ²Ð¾Ñ Ð¶Ðµ знаÑение + 1
ÐÑли вклÑÑÐµÐ½Ñ Ð½ÐµÑколÑко Ñлагов, ÑооÑвеÑÑÑвÑÑÑие опеÑаÑии вÑполнÑÑÑÑÑ Ð² показанном поÑÑдке.
Ðажно замеÑиÑÑ, ÑÑо ÑÑнкÑии ÑанжиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ иÑполÑзÑÑÑ Ð½Ð¸ÐºÐ°ÐºÑÑ Ð²Ð½ÐµÑнÑÑ Ð¸Ð½ÑоÑмаÑиÑ, Ñак ÑÑо добиÑÑÑÑ Ð½Ð¾ÑмализаÑии до 1% или 100% невозможно, Ñ
оÑÑ Ð¸Ð½Ð¾Ð³Ð´Ð° ÑÑо желаÑелÑно. ÐÑименив паÑамеÑÑ 32 (rank/(rank+1)), можно ÑвеÑÑи вÑе Ñанги к Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ 0..1, но ÑÑо изменение бÑÐ´ÐµÑ Ð»Ð¸ÑÑ ÐºÐ¾ÑмеÑиÑеÑким, на поÑÑдке ÑоÑÑиÑовки ÑезÑлÑÑаÑов ÑÑо не оÑÑазиÑÑÑ.
Рданном пÑимеÑе вÑбиÑаÑÑÑÑ Ð´ÐµÑÑÑÑ Ð½Ð°Ð¹Ð´ÐµÐ½Ð½ÑÑ Ð´Ð¾ÐºÑменÑов Ñ Ð¼Ð°ÐºÑималÑнÑм Ñангом:
SELECT title, ts_rank_cd(textsearch, query) AS rank
FROM apod, to_tsquery('neutrino|(dark & matter)') query
WHERE query @@ textsearch
ORDER BY rank DESC
LIMIT 10;
title | rank
-----------------------------------------------+----------
Neutrinos in the Sun | 3.1
The Sudbury Neutrino Detector | 2.4
A MACHO View of Galactic Dark Matter | 2.01317
Hot Gas and Dark Matter | 1.91171
The Virgo Cluster: Hot Plasma and Dark Matter | 1.90953
Rafting for Solar Neutrinos | 1.9
NGC 4650A: Strange Galaxy and Dark Matter | 1.85774
Hot Gas and Dark Matter | 1.6123
Ice Fishing for Cosmic Neutrinos | 1.6
Weak Lensing Distorts the Universe | 0.818218
Ð¢Ð¾Ñ Ð¶Ðµ пÑÐ¸Ð¼ÐµÑ Ñ Ð½Ð¾ÑмализованнÑм Ñангом:
SELECT title, ts_rank_cd(textsearch, query, 32 /* rank/(rank+1) */ ) AS rank
FROM apod, to_tsquery('neutrino|(dark & matter)') query
WHERE query @@ textsearch
ORDER BY rank DESC
LIMIT 10;
title | rank
-----------------------------------------------+-------------------
Neutrinos in the Sun | 0.756097569485493
The Sudbury Neutrino Detector | 0.705882361190954
A MACHO View of Galactic Dark Matter | 0.668123210574724
Hot Gas and Dark Matter | 0.65655958650282
The Virgo Cluster: Hot Plasma and Dark Matter | 0.656301290640973
Rafting for Solar Neutrinos | 0.655172410958162
NGC 4650A: Strange Galaxy and Dark Matter | 0.650072921219637
Hot Gas and Dark Matter | 0.617195790024749
Ice Fishing for Cosmic Neutrinos | 0.615384618911517
Weak Lensing Distorts the Universe | 0.450010798361481
РанжиÑование Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð¾Ð²Ð¾Ð»Ñно доÑогоÑÑоÑÑей опеÑаÑией, Ñак как Ð´Ð»Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ñанга необÑ
одимо пÑоÑиÑаÑÑ tsvector каждого подÑ
одÑÑего докÑменÑа и ÑÑо займÑÑ Ð·Ð½Ð°ÑиÑелÑное вÑемÑ, еÑли пÑидÑÑÑÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº диÑкÑ. Ð ÑожалениÑ, избежаÑÑ ÑÑого вÑÑд ли возможно, Ñак как на пÑакÑике по многим запÑоÑам вÑдаÑÑÑÑ Ð±Ð¾Ð»ÑÑое колиÑеÑÑво ÑезÑлÑÑаÑов.
12.3.4. ÐÑделение ÑезÑлÑÑаÑов
ÐÑедÑÑавлÑÑ ÑезÑлÑÑаÑÑ Ð¿Ð¾Ð¸Ñка, в идеале нÑжно вÑделÑÑÑ ÑаÑÑÑ Ð´Ð¾ÐºÑменÑа и показÑваÑÑ, как он ÑвÑзан Ñ Ð·Ð°Ð¿ÑоÑом. ÐбÑÑно поиÑковÑе ÑиÑÑÐµÐ¼Ñ Ð¿Ð¾ÐºÐ°Ð·ÑваÑÑ ÑÑагменÑÑ Ð´Ð¾ÐºÑменÑа Ñ Ð¾ÑмеÑеннÑми иÑкомÑми Ñловами. Ð Postgres Pro Ð´Ð»Ñ ÑеализаÑии ÑÑой возможноÑÑи пÑедÑÑавлена ÑÑнкÑÐ¸Ñ ts_headline.
ts_headline([конÑигÑÑаÑиÑregconfig,]докÑменÑtext,запÑоÑtsquery[,паÑамеÑÑÑtext]) returnstext
ts_headline пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð´Ð¾ÐºÑÐ¼ÐµÐ½Ñ Ð²Ð¼ÐµÑÑе Ñ Ð·Ð°Ð¿ÑоÑом и возвÑаÑÐ°ÐµÑ Ð²ÑдеÑÐ¶ÐºÑ Ð¸Ð· докÑменÑа, в коÑоÑой вÑделÑÑÑÑÑ Ñлова из запÑоÑа. ÐÑименÑемÑÑ Ð´Ð»Ñ ÑазбоÑа докÑменÑа конÑигÑÑаÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑказаÑÑ Ð² паÑамеÑÑе config; еÑли ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¾Ð¿ÑÑен, пÑименÑеÑÑÑ ÐºÐ¾Ð½ÑигÑÑаÑÐ¸Ñ default_text_search_config.
ÐÑли в паÑамеÑÑаÑ
пеÑедаÑÑÑÑ ÑÑÑока options, она должна ÑоÑÑоÑÑÑ Ð¸Ð· ÑпиÑка ÑазделÑннÑÑ
запÑÑÑми Ð¿Ð°Ñ Ð¿Ð°ÑамеÑÑ=знаÑение. ÐаÑамеÑÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ ÑледÑÑÑими:
StartSel,StopSel: ÑÑÑоки, коÑоÑÑе бÑдÑÑ ÑазгÑаниÑиваÑÑ Ñлова запÑоÑа в докÑменÑе, вÑделÑÑ Ð¸Ñ ÑÑеди оÑÑалÑнÑÑ . ÐÑли ÑÑи ÑÑÑоки ÑодеÑÐ¶Ð°Ñ Ð¿ÑÐ¾Ð±ÐµÐ»Ñ Ð¸Ð»Ð¸ запÑÑÑе, Ð¸Ñ Ð½Ñжно заклÑÑиÑÑ Ð² кавÑÑки.MaxWords,MinWords: ÑÑи ÑиÑла опÑеделÑÐµÑ Ð½Ð¸Ð¶Ð½Ð¸Ð¹ и веÑÑ Ð½Ð¸Ð¹ пÑедел ÑазмеÑа вÑдеÑжки.ShortWord: Ñлова Ñакой Ð´Ð»Ð¸Ð½Ñ Ð¸Ð»Ð¸ коÑоÑе в наÑале и конÑе вÑдеÑжки бÑдÑÑ Ð¾ÑбÑаÑÑваÑÑÑÑ. ÐнаÑение по ÑмолÑаниÑ, Ñавное 3, иÑклÑÑÐ°ÐµÑ ÑаÑпÑоÑÑÑанÑннÑе английÑкие аÑÑикли.HighlightAll: логиÑеÑкий Ñлаг; еÑли он Ñавенtrue, вÑдеÑжкой бÑÐ´ÐµÑ Ð²ÐµÑÑ Ð´Ð¾ÐºÑÐ¼ÐµÐ½Ñ Ð¸ ÑÑи пÑедÑдÑÑие паÑамеÑÑа игноÑиÑÑÑÑÑÑ.MaxFragments: макÑималÑное ÑиÑло вÑводимÑÑ ÑекÑÑовÑÑ Ð²ÑдеÑжек или ÑÑагменÑов. ÐнаÑение по ÑмолÑаниÑ, Ñавное 0, вÑбиÑÐ°ÐµÑ Ð¼ÐµÑод ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²ÑдеÑжки без ÑÑагменÑов. ÐÑи знаÑении болÑÑем 0 вÑбиÑаеÑÑÑ Ð¼ÐµÑод Ñ ÑÑагменÑами, когда Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ Ð²Ñе ÑÑагменÑÑ, ÑодеÑжаÑие как можно болÑÑе Ñлов запÑоÑа, а заÑем они ÑжимаÑÑÑÑ Ð´Ð¾ Ñлов запÑоÑа. Такие ÑÑагменÑÑ Ð¼Ð¾Ð³ÑÑ ÑодеÑжаÑÑ ÐºÐ°ÐºÐ¸Ðµ-Ñо клÑÑевÑе Ñлова в ÑеÑедине и огÑаниÑиваÑÑÑÑ Ð´Ð²ÑÐ¼Ñ Ð¸ÑкомÑми Ñловами. ÐÑи ÑÑом ÑÑагменÑÑ Ð¼Ð¾Ð³ÑÑ ÑодеÑжаÑÑ Ð½Ðµ болÑÑеMaxWordsÑлов, а в наÑале и конÑе они бÑдÑÑ Ð¾ÑиÑÐµÐ½Ñ Ð¾Ñ Ñлов длинÑShortWordи менÑÑе. ÐÑли в докÑменÑе Ð½Ð°Ð¹Ð´ÐµÐ½Ñ Ð½Ðµ вÑе Ñлова запÑоÑа, вÑводиÑÑÑ Ð¾Ð´Ð¸Ð½ ÑÑагменÑ, вклÑÑаÑÑий пеÑвÑеMinWordsÑлов в докÑменÑе.FragmentDelimiter: Ðогда вÑводÑÑÑÑ Ð½ÐµÑколÑко ÑÑагменÑов, они бÑдÑÑ ÑазделÑÑÑÑÑ ÑÑой ÑÑÑокой.
ÐÑе Ñвно не опÑеделÑннÑе паÑамеÑÑÑ Ð¿Ð¾Ð»ÑÑаÑÑ Ñакие знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ:
StartSel=<b>, StopSel=</b>, MaxWords=35, MinWords=15, ShortWord=3, HighlightAll=FALSE, MaxFragments=0, FragmentDelimiter=" ... "
ÐÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑзованиÑ:
SELECT ts_headline('english',
'The most common type of search
is to find all documents containing given query terms
and return them in order of their similarity to the
query.',
to_tsquery('query & similarity'));
ts_headline
------------------------------------------------------------
containing given <b>query</b> terms
and return them in order of their <b>similarity</b> to the
<b>query</b>.
SELECT ts_headline('english',
'The most common type of search
is to find all documents containing given query terms
and return them in order of their similarity to the
query.',
to_tsquery('query & similarity'),
'StartSel = <, StopSel = >');
ts_headline
-------------------------------------------------------
containing given <query> terms
and return them in order of their <similarity> to the
<query>.
ФÑнкÑÐ¸Ñ ts_headline ÑабоÑÐ°ÐµÑ Ñ Ð¾ÑигиналÑнÑм докÑменÑом, а не Ñ ÐµÐ³Ð¾ ÑжаÑÑм пÑедÑÑавлением tsvector, Ñак ÑÑо она Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾Ð¹ и иÑполÑзоваÑÑ ÐµÑ ÑледÑÐµÑ Ð¾ÑмоÑÑиÑелÑно. ТипиÑÐ½Ð°Ñ Ð¾Ñибка â вÑзÑваÑÑ ts_headline Ð´Ð»Ñ Ð²ÑеÑ
подÑ
одÑÑиÑ
докÑменÑов, когда показÑваÑÑÑÑ ÑолÑко деÑÑÑÑ. ÐÑавилÑнÑй подÑ
од можно ÑеализоваÑÑ, пÑименив подзапÑоÑÑ SQL, напÑÐ¸Ð¼ÐµÑ Ñак:
SELECT id, ts_headline(body, q), rank
FROM (SELECT id, body, q, ts_rank_cd(ti, q) AS rank
FROM apod, to_tsquery('stars') q
WHERE ti @@ q
ORDER BY rank DESC
LIMIT 10) AS foo;