8.11. ТипÑ, пÑедназнаÑеннÑе Ð´Ð»Ñ ÑекÑÑового поиÑка #
Postgres Pro пÑедоÑÑавлÑÐµÑ Ð´Ð²Ð° Ñипа даннÑÑ
Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки полноÑекÑÑового поиÑка. ТекÑÑовÑм поиÑком назÑваеÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð° набоÑа докÑменÑов Ñ ÑекÑÑом на еÑÑеÑÑвенном ÑзÑке, в ÑезÑлÑÑаÑе коÑоÑой наÑ
одÑÑÑÑ ÑÑагменÑÑ, наиболее ÑооÑвеÑÑÑвÑÑÑие запÑоÑÑ. Тип tsvector пÑедÑÑавлÑÐµÑ Ð´Ð¾ÐºÑÐ¼ÐµÐ½Ñ Ð² виде, опÑимизиÑованном Ð´Ð»Ñ ÑекÑÑового поиÑка, а tsquery пÑедÑÑавлÑÐµÑ Ð·Ð°Ð¿ÑÐ¾Ñ ÑекÑÑового поиÑка в подобном виде. Ðолее подÑобно ÑÑо опиÑÑваеÑÑÑ Ð² Ðлаве 12, а вÑе ÑвÑзаннÑе ÑÑнкÑии и опеÑаÑоÑÑ Ð¿ÐµÑеÑиÑÐ»ÐµÐ½Ñ Ð² Разделе 9.13.
8.11.1. tsvector #
ÐнаÑение Ñипа tsvector ÑодеÑÐ¶Ð¸Ñ Ð¾ÑÑоÑÑиÑованнÑй ÑпиÑок неповÑоÑÑÑÑиÑ
ÑÑ Ð»ÐµÐºÑем, Ñ. е. Ñлов, ноÑмализованнÑÑ
Ñак, ÑÑо вÑе ÑловоÑоÑÐ¼Ñ ÑводÑÑÑÑ Ðº одной (подÑобнее ÑÑо опиÑано в Ðлаве 12). СоÑÑиÑовка и иÑклÑÑение повÑоÑÑÑÑиÑ
ÑÑ Ñлов пÑоизводиÑÑÑ Ð°Ð²ÑомаÑиÑеÑки пÑи вводе знаÑениÑ, как показано в ÑÑом пÑимеÑе:
SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector;
tsvector
----------------------------------------------------
'a' 'and' 'ate' 'cat' 'fat' 'mat' 'on' 'rat' 'sat'ÐÐ»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² виде лекÑем пÑобелов или знаков пÑÐµÐ¿Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¸Ñ Ð½Ñжно заклÑÑиÑÑ Ð² апоÑÑÑоÑÑ:
SELECT $$the lexeme ' ' contains spaces$$::tsvector;
tsvector
-------------------------------------------
' ' 'contains' 'lexeme' 'spaces' 'the'(Рданном и ÑледÑÑÑÐ¸Ñ Ð¿ÑимеÑÐ°Ñ Ð¼Ñ Ð¸ÑполÑзÑем ÑÑÑÐ¾ÐºÑ Ð² доллаÑÐ°Ñ , ÑÑÐ¾Ð±Ñ Ð½Ðµ дÑблиÑоваÑÑ Ð²Ñе апоÑÑÑоÑÑ Ð² ÑÐ°ÐºÐ¸Ñ ÑÑÑÐ¾ÐºÐ°Ñ .) ÐÑи ÑÑом вклÑÑаемÑй апоÑÑÑÐ¾Ñ Ð¸Ð»Ð¸ обÑаÑнÑÑ ÐºÐ¾ÑÑÑ ÑеÑÑÑ Ð½Ñжно пÑодÑблиÑоваÑÑ:
SELECT $$the lexeme 'Joe''s' contains a quote$$::tsvector;
tsvector
------------------------------------------------
'Joe''s' 'a' 'contains' 'lexeme' 'quote' 'the'Также Ð´Ð»Ñ Ð»ÐµÐºÑем можно ÑказаÑÑ Ð¸Ñ ÑелоÑиÑленнÑе позиÑии:
SELECT 'a:1 fat:2 cat:3 sat:4 on:5 a:6 mat:7 and:8 ate:9 a:10 fat:11 rat:12'::tsvector;
tsvector
-------------------------------------------------------------------â------------
'a':1,6,10 'and':8 'ate':9 'cat':3 'fat':2,11 'mat':7 'on':5 'rat':12 'sat':4ÐозиÑÐ¸Ñ Ð¾Ð±ÑÑно ÑказÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ðµ иÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñлова в докÑменÑе. ÐнÑоÑмаÑÐ¸Ñ Ð¾ ÑаÑположении Ñлов заÑем Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ð¾Ñенки близоÑÑи. ÐозиÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ ÑиÑлом Ð¾Ñ 1 до 16383; болÑÑие знаÑÐµÐ½Ð¸Ñ Ð¿ÑоÑÑо заменÑÑÑÑÑ Ð½Ð° 16383. ÐÑли Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ лекÑÐµÐ¼Ñ Ð´Ð²Ð°Ð¶Ð´Ñ ÑказÑваеÑÑÑ Ð¾Ð´Ð½Ð¾ положение, Ñакое повÑоÑение оÑбÑаÑÑваеÑÑÑ.
ÐекÑемам, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
Ð·Ð°Ð´Ð°Ð½Ñ Ð¿Ð¾Ð·Ð¸Ñии, Ñакже можно назнаÑиÑÑ Ð²ÐµÑ, вÑÑаженнÑй бÑквами A, B, C или D. ÐÐµÑ D подÑазÑмеваеÑÑÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ поÑÑÐ¾Ð¼Ñ Ð½Ðµ показÑваеÑÑÑ Ð¿Ñи вÑводе:
SELECT 'a:1A fat:2B,4C cat:5D'::tsvector;
tsvector
----------------------------
'a':1A 'cat':5 'fat':2B,4CÐеÑа обÑÑно пÑименÑÑÑÑÑ Ð´Ð»Ñ Ð¾ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑÑÑÑкÑÑÑÑ Ð´Ð¾ÐºÑменÑа, напÑÐ¸Ð¼ÐµÑ Ð´Ð»Ñ Ð¿ÑÐ¸Ð´Ð°Ð½Ð¸Ñ Ð¾Ñобого знаÑÐµÐ½Ð¸Ñ Ñловам в заголовке по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñо Ñловами в обÑÑном ÑекÑÑе. ÐазнаÑеннÑм веÑам можно ÑопоÑÑавиÑÑ ÑиÑловÑе пÑиоÑиÑеÑÑ Ð² ÑÑнкÑиÑÑ ÑанжиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑезÑлÑÑаÑов.
Ðажно понимаÑÑ, ÑÑо Ñип tsvector Ñам по Ñебе не вÑполнÑÐµÑ Ð½Ð¾ÑмализаÑÐ¸Ñ Ñлов; пÑедполагаеÑÑÑ, ÑÑо в ÑоÑ
ÑанÑемом знаÑении Ñлова Ñже ноÑÐ¼Ð°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ñ Ð¿Ñиложением. ÐапÑимеÑ:
SELECT 'The Fat Rats'::tsvector;
tsvector
--------------------
'Fat' 'Rats' 'The' ÐÐ»Ñ Ð±Ð¾Ð»ÑÑинÑÑва англоÑзÑÑнÑÑ
пÑиложений пÑиведÑннÑе вÑÑе Ñлова бÑдÑÑ ÑÑиÑаÑÑÑÑ Ð½ÐµÐ½Ð¾ÑмализованнÑми, но Ð´Ð»Ñ tsvector ÑÑо не важно. ÐоÑÑÐ¾Ð¼Ñ Ð¸ÑÑ
однÑй докÑÐ¼ÐµÐ½Ñ Ð¾Ð±ÑÑно ÑледÑÐµÑ Ð¾Ð±ÑабоÑаÑÑ ÑÑнкÑией to_tsvector, ноÑмализÑÑÑей Ñлова Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка:
SELECT to_tsvector('english', 'The Fat Rats');
to_tsvector
-----------------
'fat':2 'rat':3Ð ÑÑо подÑобнее опиÑано в Ðлаве 12.
8.11.2. tsquery #
ÐнаÑение tsquery ÑодеÑÐ¶Ð¸Ñ Ð¸ÑкомÑе лекÑемÑ, обÑединÑемÑе логиÑеÑкими опеÑаÑоÑами & (Ð), | (ÐÐÐ) и ! (ÐÐ), а Ñакже опеÑаÑоÑом поиÑка ÑÑаз <-> (ÐÐ ÐÐШÐСТÐУÐТ). Также допÑÑкаеÑÑÑ Ð²Ð°ÑиаÑÐ¸Ñ Ð¾Ð¿ÐµÑаÑоÑа ÐÐ ÐÐШÐСТÐУÐТ вида <, где N>N â ÑелоÑиÑÐ»ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð½ÑÑанÑа, задаÑÑÐ°Ñ ÑаÑÑÑоÑние Ð¼ÐµÐ¶Ð´Ñ Ð´Ð²ÑÐ¼Ñ Ð¸ÑкомÑми лекÑемами. ÐапиÑÑ Ð¾Ð¿ÐµÑаÑоÑа <-> ÑавнознаÑна <1>.
ÐÐ»Ñ Ð³ÑÑппиÑовки опеÑаÑоÑов могÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ñкобки. Ðез Ñкобок ÑÑи опеÑаÑоÑÑ Ð¸Ð¼ÐµÑÑ ÑазнÑе пÑиоÑиÑеÑÑ, в поÑÑдке ÑбÑваниÑ: ! (ÐÐ), <-> (ÐÐ ÐÐШÐСТÐУÐТ), & (Ð) и | (ÐÐÐ).
ÐеÑколÑко пÑимеÑов:
SELECT 'fat & rat'::tsquery;
tsquery
---------------
'fat' & 'rat'
SELECT 'fat & (rat | cat)'::tsquery;
tsquery
---------------------------
'fat' & ( 'rat' | 'cat' )
SELECT 'fat & rat & ! cat'::tsquery;
tsquery
------------------------
'fat' & 'rat' & !'cat'ÐекÑемам в tsquery можно дополниÑелÑно ÑопоÑÑавиÑÑ Ð±ÑÐºÐ²Ñ Ð²ÐµÑов, пÑи ÑÑом они бÑдÑÑ ÑооÑвеÑÑÑвоваÑÑ ÑолÑко Ñем лекÑемам в tsvector, коÑоÑÑе имеÑÑ ÐºÐ°ÐºÐ¾Ð¹-либо из ÑÑиÑ
веÑов:
SELECT 'fat:ab & cat'::tsquery;
tsquery
------------------
'fat':AB & 'cat'ÐÑоме Ñого, в лекÑемаÑ
tsquery можно иÑполÑзоваÑÑ Ð·Ð½Ð°Ðº * Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка по пÑеÑикÑÑ:
SELECT 'super:*'::tsquery; tsquery ----------- 'super':*
ÐÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð½Ð°Ð¹Ð´ÑÑ Ð²Ñе Ñлова в tsvector, наÑинаÑÑиеÑÑ Ñ Ð¿ÑиÑÑавки «super».
ÐпоÑÑÑоÑÑ Ð² лекÑемаÑ
ÑÑого Ñипа можно иÑполÑзоваÑÑ Ñак же, как и в лекÑемаÑ
в tsvector; и Ñак же, как и Ð´Ð»Ñ Ñипа tsvector, необÑ
Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð½Ð¾ÑмализаÑÐ¸Ñ Ñлова должна вÑполнÑÑÑÑÑ Ð´Ð¾ пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ðº ÑÐ¸Ð¿Ñ tsquery. ÐÐ»Ñ Ñакой ноÑмализаÑии Ñдобно иÑполÑзоваÑÑ ÑÑнкÑÐ¸Ñ to_tsquery:
SELECT to_tsquery('Fat:ab & Cats');
to_tsquery
------------------
'fat':AB & 'cat' ÐамеÑÑÑе, ÑÑо ÑÑнкÑÐ¸Ñ to_tsquery бÑÐ´ÐµÑ Ð¾Ð±ÑабаÑÑваÑÑ Ð¿ÑеÑикÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾ дÑÑгим Ñловам, поÑÑÐ¾Ð¼Ñ ÑледÑÑÑее ÑÑавнение возвÑаÑÐ°ÐµÑ true:
SELECT to_tsvector( 'postgraduate' ) @@ to_tsquery( 'postgres:*' ); ?column? ---------- t
Ñак как postgres пÑеобÑазÑеÑÑÑ ÑÑеммеÑом в postgr:
SELECT to_tsvector( 'postgraduate' ), to_tsquery( 'postgres:*' ); to_tsvector | to_tsquery ---------------+------------ 'postgradu':1 | 'postgr':*
и ÑÑа пÑиÑÑавка наÑ
одиÑÑÑ Ð² пÑеобÑазованной ÑоÑме Ñлова postgraduate.