12.1. Ðведение
ÐолноÑекÑÑовÑй поиÑк (или пÑоÑÑо поиÑк ÑекÑÑа) â ÑÑо возможноÑÑÑ Ð½Ð°Ñ
одиÑÑ Ð´Ð¾ÐºÑменÑÑ Ð½Ð° еÑÑеÑÑвенном ÑзÑке, ÑооÑвеÑÑÑвÑÑÑие запÑоÑÑ, и, возможно, дополниÑелÑно ÑоÑÑиÑоваÑÑ Ð¸Ñ
по ÑелеванÑноÑÑи Ð´Ð»Ñ ÑÑого запÑоÑа. Ðаиболее ÑаÑпÑоÑÑÑанÑÐ½Ð½Ð°Ñ Ð·Ð°Ð´Ð°Ñа â найÑи вÑе докÑменÑÑ, ÑодеÑжаÑие Ñлова запÑоÑа, и вÑдаÑÑ Ð¸Ñ
оÑÑоÑÑиÑованнÑми по ÑÑепени ÑооÑвеÑÑÑÐ²Ð¸Ñ Ð·Ð°Ð¿ÑоÑÑ. ÐонÑÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑа и ÑооÑвеÑÑÑÐ²Ð¸Ñ Ð´Ð¾Ð²Ð¾Ð»Ñно ÑаÑплÑвÑаÑÑ Ð¸ завиÑÑÑ Ð¾Ñ ÐºÐ¾Ð½ÐºÑеÑного пÑиложениÑ. Ð Ñамом пÑоÑÑом ÑлÑÑае запÑоÑом ÑÑиÑаеÑÑÑ Ð½Ð°Ð±Ð¾Ñ Ñлов, а ÑооÑвеÑÑÑвие опÑеделÑеÑÑÑ ÑаÑÑоÑой Ñлов в докÑменÑе.
ÐпеÑаÑоÑÑ ÑекÑÑового поиÑка ÑÑÑеÑÑвÑÑÑ Ð² СУÐÐ Ñже многие годÑ. Ð PostgreSQL Ð´Ð»Ñ ÑекÑÑовÑÑ
Ñипов даннÑÑ
еÑÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ ~, ~*, LIKE и ILIKE, но им не Ñ
ваÑÐ°ÐµÑ Ð¾ÑÐµÐ½Ñ Ð²Ð°Ð¶Ð½ÑÑ
веÑей, коÑоÑÑе ÑÑебÑÑÑÑÑ ÑÐµÐ³Ð¾Ð´Ð½Ñ Ð¾Ñ Ð¸Ð½ÑоÑмаÑионнÑÑ
ÑиÑÑем:
ÐÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑжки лингвиÑÑиÑеÑкой ÑÑнкÑионалÑноÑÑи, даже Ð´Ð»Ñ Ð°Ð½Ð³Ð»Ð¸Ð¹Ñкого ÑзÑка. ÐозможноÑÑи ÑегÑлÑÑнÑÑ Ð²ÑÑажений огÑаниÑÐµÐ½Ñ â они не ÑаÑÑÑиÑÐ°Ð½Ñ Ð½Ð° ÑабоÑÑ Ñо ÑловоÑоÑмами, напÑимеÑ,
Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑÐ¸Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¸ÑÑ. С ними Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пÑопÑÑÑиÑÑ Ð´Ð¾ÐºÑменÑÑ, коÑоÑÑе ÑодеÑжаÑÐ¿Ð¾Ð´Ñ Ð¾Ð´ÑÑ, но, веÑоÑÑно, и они пÑедÑÑавлÑÑÑ Ð¸Ð½ÑеÑÐµÑ Ð¿Ñи поиÑке по клÑÑÐµÐ²Ð¾Ð¼Ñ ÑловÑÐ¿Ð¾Ð´Ñ Ð¾Ð´Ð¸ÑÑ. ÐонеÑно, можно попÑÑаÑÑÑÑ Ð¿ÐµÑеÑиÑлиÑÑ Ð² ÑегÑлÑÑном вÑÑажении вÑе ваÑианÑÑ Ñлова, но ÑÑо бÑÐ´ÐµÑ Ð¾ÑÐµÐ½Ñ ÑÑÑдоÑмко и ÑÑеваÑо оÑибками (некоÑоÑÑе Ñлова могÑÑ Ð¸Ð¼ÐµÑÑ Ð´ÐµÑÑÑки ÑловоÑоÑм).Ðни не позволÑÑÑ ÑпоÑÑдоÑиваÑÑ ÑезÑлÑÑаÑÑ Ð¿Ð¾Ð¸Ñка (по ÑелеванÑноÑÑи), а без ÑÑого поиÑк неÑÑÑекÑивен, когда Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ ÑоÑни Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑÐ¸Ñ Ð´Ð¾ÐºÑменÑов.
Ðни обÑÑно вÑполнÑÑÑÑÑ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾ из-за оÑÑÑÑÑÑÐ²Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑов, Ñак как пÑи каждом поиÑке пÑÐ¸Ñ Ð¾Ð´Ð¸ÑÑÑ Ð¿ÑоÑмаÑÑиваÑÑ Ð²Ñе докÑменÑÑ.
ÐолноÑекÑÑÐ¾Ð²Ð°Ñ Ð¸Ð½Ð´ÐµÐºÑаÑÐ¸Ñ Ð·Ð°ÐºÐ»ÑÑаеÑÑÑ Ð² пÑедваÑиÑелÑной обÑабоÑке докÑменÑов и ÑÐ¾Ñ Ñанении индекÑа Ð´Ð»Ñ Ð¿Ð¾ÑледÑÑÑего бÑÑÑÑого поиÑка. ÐÑедваÑиÑелÑÐ½Ð°Ñ Ð¾Ð±ÑабоÑка вклÑÑÐ°ÐµÑ ÑледÑÑÑие опеÑаÑии:
Ð Ð°Ð·Ð±Ð¾Ñ Ð´Ð¾ÐºÑменÑов на ÑÑагменÑÑ. ÐÑи ÑÑом полезно вÑделиÑÑ ÑазлиÑнÑе клаÑÑÑ ÑÑагменÑов, напÑимеÑ, ÑиÑла, Ñлова, ÑловоÑоÑеÑаниÑ, поÑÑовÑе адÑеÑа и Ñ. д., коÑоÑÑе бÑдÑÑ Ð¾Ð±ÑабаÑÑваÑÑÑÑ Ð¿Ð¾-ÑазномÑ. РпÑинÑипе клаÑÑÑ ÑÑагменÑов могÑÑ Ð·Ð°Ð²Ð¸ÑеÑÑ Ð¾Ñ Ð¿ÑиложениÑ, но Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑинÑÑва пÑименений вполне подойдÑÑ Ð¿ÑедопÑеделÑннÑй Ð½Ð°Ð±Ð¾Ñ ÐºÐ»Ð°ÑÑов. ÐÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð² PostgreSQL вÑполнÑÐµÑ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°ÑÐ¾Ñ (parser). ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ ÐºÐ°Ðº ÑÑандаÑÑнÑй анализаÑоÑ, Ñак и ÑоздаваÑÑ Ñвои, ÑзкоÑпеÑиализиÑованнÑе.
ÐÑеобÑазование ÑÑагменÑов в лекÑемÑ. ÐекÑема â ÑÑо ноÑмализованнÑй ÑÑагменÑ, в коÑоÑом ÑазнÑе ÑловоÑоÑÐ¼Ñ Ð¿ÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ðº одной. ÐапÑимеÑ, пÑи ноÑмализаÑии бÑÐºÐ²Ñ Ð²ÐµÑÑ Ð½ÐµÐ³Ð¾ ÑегиÑÑÑа пÑиводÑÑÑÑ Ðº нижнемÑ, а из Ñлов обÑÑно ÑбиÑаÑÑÑÑ Ð¾ÐºÐ¾Ð½ÑÐ°Ð½Ð¸Ñ (в ÑаÑÑноÑÑи,
sилиesв английÑком). ÐлагодаÑÑ ÑÑÐ¾Ð¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑ ÑазнÑе ÑоÑÐ¼Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñлова, не Ð²Ð²Ð¾Ð´Ñ Ð²ÑÑÑнÑÑ Ð²Ñе возможнÑе ваÑианÑÑ. ÐÑоме Ñого, на данном Ñаге обÑÑно иÑклÑÑаÑÑÑÑ ÑÑоп-Ñлова, Ñо еÑÑÑ Ñлова, наÑÑолÑко ÑаÑпÑоÑÑÑанÑннÑе, ÑÑо иÑкаÑÑ Ð¸Ñ Ð½ÐµÑ ÑмÑÑла. (ÐÑÑгими Ñловами, ÑÑагменÑÑ Ð¿ÑедÑÑавлÑÑÑ Ñобой пÑоÑÑо подÑÑÑоки ÑекÑÑа докÑменÑа, а лекÑÐµÐ¼Ñ â ÑÑо Ñлова, имеÑÑие ÑенноÑÑÑ Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑаÑии и поиÑка.) ÐÐ»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑого Ñага в PostgreSQL иÑполÑзÑÑÑÑÑ ÑловаÑи. ÐÐ°Ð±Ð¾Ñ ÑÑÑеÑÑвÑÑÑÐ¸Ñ ÑÑандаÑÑнÑÑ ÑловаÑей пÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи можно ÑаÑÑиÑÑÑÑ, ÑÐ¾Ð·Ð´Ð°Ð²Ð°Ñ Ñвои ÑобÑÑвеннÑе.Ð¥Ñанение докÑменÑов в ÑоÑме, подгоÑовленной Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка. ÐапÑимеÑ, каждÑй докÑÐ¼ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑедÑÑавлен в виде ÑоÑÑиÑованного маÑÑива ноÑмализованнÑÑ Ð»ÐµÐºÑем. Ðомимо лекÑем ÑаÑÑо желаÑелÑно Ñ ÑаниÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð± Ð¸Ñ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ð¸ Ð´Ð»Ñ ÑанжиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ близоÑÑи, ÑÑÐ¾Ð±Ñ Ð´Ð¾ÐºÑменÑ, в коÑоÑом Ñлова запÑоÑа ÑаÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ñ Â«Ð¿Ð»Ð¾Ñнее», полÑÑал более вÑÑокий Ñанг, Ñем докÑÐ¼ÐµÐ½Ñ Ñ ÑазбÑоÑаннÑми Ñловами.
СловаÑи позволÑÑÑ ÑпÑавлÑÑÑ Ð½Ð¾ÑмализаÑией ÑÑагменÑов Ñ Ð±Ð¾Ð»ÑÑой гибкоÑÑÑÑ. Ð¡Ð¾Ð·Ð´Ð°Ð²Ð°Ñ ÑловаÑи, можно:
ÐпÑеделÑÑÑ ÑÑоп-Ñлова, коÑоÑÑе не бÑдÑÑ Ð¸Ð½Ð´ÐµÐºÑиÑоваÑÑÑÑ.
СопоÑÑавлÑÑÑ ÑÐ¸Ð½Ð¾Ð½Ð¸Ð¼Ñ Ñ Ð¾Ð´Ð½Ð¸Ð¼ Ñловом, иÑполÑзÑÑ Ispell.
СопоÑÑавлÑÑÑ ÑловоÑоÑеÑÐ°Ð½Ð¸Ñ Ñ Ð¾Ð´Ð½Ð¸Ð¼ Ñловом, иÑполÑзÑÑ ÑезаÑÑÑÑ.
СопоÑÑавлÑÑÑ ÑазлиÑнÑе ÑÐºÐ»Ð¾Ð½ÐµÐ½Ð¸Ñ Ñлова Ñ ÐºÐ°Ð½Ð¾Ð½Ð¸ÑеÑкой ÑоÑмой, иÑполÑзÑÑ ÑловаÑÑ Ispell.
СопоÑÑавлÑÑÑ ÑазлиÑнÑе ÑÐºÐ»Ð¾Ð½ÐµÐ½Ð¸Ñ Ñлова Ñ ÐºÐ°Ð½Ð¾Ð½Ð¸ÑеÑкой ÑоÑмой, иÑполÑзÑÑ ÑÑÐµÐ¼Ð¼ÐµÑ Snowball.
ÐÐ»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð³Ð¾ÑовленнÑÑ
докÑменÑов в PostgreSQL пÑедназнаÑен Ñип даннÑÑ
tsvector, а Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±ÑабоÑаннÑÑ
запÑоÑов â Ñип tsquery (Раздел 8.11). С ÑÑими Ñипами даннÑÑ
ÑабоÑаÑÑ ÑелÑй ÑÑд ÑÑнкÑий и опеÑаÑоÑов (Раздел 9.13), и наиболее важнÑй из ниÑ
â опеÑаÑÐ¾Ñ ÑооÑвеÑÑÑÐ²Ð¸Ñ @@, Ñ ÐºÐ¾ÑоÑÑм Ð¼Ñ Ð¿Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð¸Ð¼ÑÑ Ð² ÐодÑазделе 12.1.2. ÐÐ»Ñ ÑÑкоÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑекÑÑового поиÑка могÑÑ Ð¿ÑименÑÑÑÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ (Раздел 12.9).
12.1.1. ЧÑо Ñакое докÑменÑ?
ÐокÑÐ¼ÐµÐ½Ñ â ÑÑо единиÑа обÑабоÑки в ÑиÑÑеме полноÑекÑÑового поиÑка; напÑимеÑ, жÑÑналÑÐ½Ð°Ñ ÑÑаÑÑÑ Ð¸Ð»Ð¸ поÑÑовое ÑообÑение. СиÑÑема поиÑка ÑекÑÑа должна ÑмеÑÑ ÑазбиÑаÑÑ Ð´Ð¾ÐºÑменÑÑ Ð¸ ÑÐ¾Ñ ÑанÑÑÑ ÑвÑзи лекÑем (клÑÑевÑÑ Ñлов) Ñ ÑодеÑжаÑим Ð¸Ñ Ð´Ð¾ÐºÑменÑом. ÐпоÑледÑÑвии ÑÑи ÑвÑзи могÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка докÑменÑов Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñми клÑÑевÑми Ñловами.
РконÑекÑÑе поиÑка в PostgreSQL докÑÐ¼ÐµÐ½Ñ â ÑÑо обÑÑно ÑодеÑжимое ÑекÑÑового Ð¿Ð¾Ð»Ñ Ð² ÑÑÑоке ÑаблиÑÑ Ð¸Ð»Ð¸, возможно, ÑоÑеÑание (обÑединение) ÑÐ°ÐºÐ¸Ñ Ð¿Ð¾Ð»ÐµÐ¹, коÑоÑÑе могÑÑ Ñ ÑаниÑÑÑÑ Ð² ÑазнÑÑ ÑаблиÑÐ°Ñ Ð¸Ð»Ð¸ ÑоÑмиÑоваÑÑÑÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки. ÐÑÑгими Ñловами, докÑÐ¼ÐµÐ½Ñ Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑаÑии Ð¼Ð¾Ð¶ÐµÑ ÑоздаваÑÑÑÑ Ð¸Ð· неÑколÑÐºÐ¸Ñ ÑаÑÑей и не Ñ ÑаниÑÑÑÑ Ð³Ð´Ðµ-либо как единое Ñелое. ÐапÑимеÑ:
SELECT title || ' ' || author || ' ' || abstract || ' ' || body AS document FROM messages WHERE mid = 12; SELECT m.title || ' ' || m.author || ' ' || m.abstract || ' ' || d.body AS document FROM messages m, docs d WHERE m.mid = d.did AND m.mid = 12;
ÐÑимеÑание
Ðа Ñамом деле в ÑÑиÑ
пÑимеÑаÑ
запÑоÑов ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ ÑÑнкÑÐ¸Ñ coalesce, ÑÑÐ¾Ð±Ñ Ð·Ð½Ð°Ñение NULL в каком-либо одном аÑÑибÑÑе не пÑивело к ÑомÑ, ÑÑо ÑезÑлÑÑиÑÑÑÑим докÑменÑом окажеÑÑÑ NULL.
ÐокÑменÑÑ Ñакже можно Ñ ÑаниÑÑ Ð² обÑÑнÑÑ ÑекÑÑовÑÑ ÑÐ°Ð¹Ð»Ð°Ñ Ð² Ñайловой ÑиÑÑеме. Ð ÑÑом ÑлÑÑае база даннÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑоÑÑо Ñ ÑанилиÑем полноÑекÑÑового индекÑа и иÑполниÑелем запÑоÑов, а найденнÑе докÑменÑÑ Ð±ÑдÑÑ Ð·Ð°Ð³ÑÑжаÑÑÑÑ Ð¸Ð· Ñайловой ÑиÑÑÐµÐ¼Ñ Ð¿Ð¾ некоÑоÑÑм ÑникалÑнÑм иденÑиÑикаÑоÑам. Ðднако Ð´Ð»Ñ Ð·Ð°Ð³ÑÑзки внеÑÐ½Ð¸Ñ Ñайлов ÑÑебÑÑÑÑÑ Ð¿Ñава ÑÑпеÑполÑзоваÑÐµÐ»Ñ Ð¸Ð»Ð¸ поддеÑжка ÑпеÑиалÑнÑÑ ÑÑнкÑий, Ñак ÑÑо ÑÑо обÑÑно менее Ñдобно, Ñем Ñ ÑаниÑÑ Ð²Ñе даннÑе внÑÑÑи ÐÐ PostgreSQL. ÐÑоме Ñого, когда вÑÑ Ñ ÑаниÑÑÑ Ð² базе даннÑÑ , ÑÑо ÑпÑоÑÐ°ÐµÑ Ð´Ð¾ÑÑÑп к меÑаданнÑм докÑменÑов пÑи индекÑаÑии и вÑводе ÑезÑлÑÑаÑов.
ÐÐ»Ñ Ð½Ñжд ÑекÑÑового поиÑка каждÑй докÑÐ¼ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ ÑведÑн к ÑпеÑиалÑÐ½Ð¾Ð¼Ñ ÑоÑмаÑÑ tsvector. ÐоиÑк и ÑанжиÑование вÑполнÑеÑÑÑ Ð¸ÑклÑÑиÑелÑно Ñ ÑÑим пÑедÑÑавлением докÑменÑа â иÑÑ
однÑй ÑекÑÑ Ð¿Ð¾ÑÑебÑеÑÑÑ Ð¸Ð·Ð²Ð»ÐµÑÑ, ÑолÑко когда докÑÐ¼ÐµÐ½Ñ Ð±ÑÐ´ÐµÑ Ð¾ÑобÑан Ð´Ð»Ñ Ð²Ñвода полÑзоваÑелÑ. ÐоÑÑÐ¾Ð¼Ñ Ð¼Ñ ÑаÑÑо подÑазÑмеваем под tsvector докÑменÑ, Ñогда как ÑÑÐ¾Ñ Ñип, конеÑно, ÑодеÑÐ¶Ð¸Ñ ÑолÑко компакÑное пÑедÑÑавление вÑего докÑменÑа.
12.1.2. ÐÑоÑÑое ÑооÑвеÑÑÑвие ÑекÑÑа
ÐолноÑекÑÑовÑй поиÑк в PostgreSQL Ñеализован на базе опеÑаÑоÑа ÑооÑвеÑÑÑÐ²Ð¸Ñ @@, коÑоÑÑй возвÑаÑÐ°ÐµÑ true, еÑли tsvector (докÑменÑ) ÑооÑвеÑÑÑвÑÐµÑ tsquery (запÑоÑÑ). ÐÐ»Ñ ÑÑого опеÑаÑоÑа не важно, какой Ñип запиÑан пеÑвÑм:
SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector @@ 'cat & rat'::tsquery; ?column? ---------- t SELECT 'fat & cow'::tsquery @@ 'a fat cat sat on a mat and ate a fat rat'::tsvector; ?column? ---------- f
Ðак можно догадаÑÑÑÑ Ð¸Ð· ÑÑого пÑимеÑа, tsquery â ÑÑо не пÑоÑÑо ÑекÑÑ, как и tsvector. ÐнаÑение Ñипа tsquery ÑодеÑÐ¶Ð¸Ñ Ð¸ÑкомÑе Ñлова, ÑÑо Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ñже ноÑмализованнÑе лекÑемÑ, возможно обÑединÑннÑе в вÑÑажение опеÑаÑоÑами Ð, ÐÐÐ, ÐРи ÐÐ ÐÐШÐСТÐУÐТ. (ÐодÑобнее ÑинÑакÑÐ¸Ñ Ð¾Ð¿Ð¸Ñан в ÐодÑазделе 8.11.2.) ÐÑ Ð¼Ð¾Ð¶ÐµÑе воÑполÑзоваÑÑÑÑ ÑÑнкÑиÑми to_tsquery, plainto_tsquery и phraseto_tsquery, коÑоÑÑе могÑÑ Ð¿ÑеобÑазоваÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ñй полÑзоваÑелем ÑекÑÑ Ð² знаÑение tsquery, пÑежде вÑего ноÑмализÑÑ Ñлова в ÑÑом ÑекÑÑе. ФÑнкÑÐ¸Ñ to_tsvector подобнÑм обÑазом Ð¼Ð¾Ð¶ÐµÑ ÑазобÑаÑÑ Ð¸ ноÑмализоваÑÑ ÑекÑÑовое ÑодеÑжимое докÑменÑа. Так ÑÑо запÑÐ¾Ñ Ñ Ð¿Ð¾Ð¸Ñком ÑооÑвеÑÑÑÐ²Ð¸Ñ Ð½Ð° пÑакÑике вÑглÑÐ´Ð¸Ñ ÑкоÑее Ñак:
SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat');
?column?
----------
tÐамеÑÑÑе, ÑÑо ÑооÑвеÑÑÑвие не бÑÐ´ÐµÑ Ð¾Ð±Ð½Ð°ÑÑжено, еÑли запÑÐ¾Ñ Ð·Ð°Ð¿Ð¸Ñан как
SELECT 'fat cats ate fat rats'::tsvector @@ to_tsquery('fat & rat');
?column?
----------
f Ñак как Ñлово rats не бÑÐ´ÐµÑ Ð½Ð¾Ñмализовано. ÐлеменÑами tsvector ÑвлÑÑÑÑÑ Ð»ÐµÐºÑемÑ, пÑедположиÑелÑно Ñже ноÑмализованнÑе, Ñак ÑÑо rats ÑÑиÑаеÑÑÑ Ð½Ðµ ÑооÑвеÑÑÑвÑÑÑим rat.
ÐпеÑаÑÐ¾Ñ @@ Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинимаÑÑ ÑÐ¸Ð¿Ñ text, позволÑÑ Ð¾Ð¿ÑÑÑиÑÑ ÑвнÑе пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑекÑÑовÑÑ
ÑÑÑок в ÑÐ¸Ð¿Ñ tsvector и tsquery в пÑоÑÑÑÑ
ÑлÑÑаÑÑ
. ÐÑего еÑÑÑ ÑеÑÑÑе ваÑианÑа ÑÑого опеÑаÑоÑа:
tsvector @@ tsquery tsquery @@ tsvector text @@ tsquery text @@ text
ÐеÑвÑе два Ð¼Ñ Ñже видели ÑанÑÑе. ФоÑма text@@tsquery ÑавнознаÑна вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ to_tsvector(x) @@ y, а ÑоÑма text@@text â вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ to_tsvector(x) @@ plainto_tsquery(y).
РзнаÑении tsquery опеÑаÑÐ¾Ñ & (Ð) ÑказÑваеÑ, ÑÑо оба его опеÑанда Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑиÑÑÑÑÑвоваÑÑ Ð² докÑменÑе, ÑÑÐ¾Ð±Ñ Ð¾Ð½ ÑдовлеÑвоÑÑл запÑоÑÑ. ÐодобнÑм обÑазом, опеÑаÑÐ¾Ñ | (ÐÐÐ) ÑказÑваеÑ, ÑÑо в докÑменÑе должен пÑиÑÑÑÑÑвоваÑÑ Ð¼Ð¸Ð½Ð¸Ð¼Ñм один из его опеÑандов, Ñогда как опеÑаÑÐ¾Ñ ! (ÐÐ) ÑказÑваеÑ, ÑÑо его опеÑанд не должен пÑиÑÑÑÑÑвоваÑÑ, ÑÑÐ¾Ð±Ñ ÑÑловие ÑдовлеÑвоÑÑлоÑÑ. ÐапÑимеÑ, запÑоÑÑ fat & ! rat ÑооÑвеÑÑÑвÑÑÑ Ð´Ð¾ÐºÑменÑÑ, ÑодеÑжаÑие fat и не ÑодеÑжаÑие rat.
ФÑазовÑй поиÑк возможен Ñ Ð¸ÑполÑзованием опеÑаÑоÑа <-> (ÐÐ ÐÐШÐСТÐУÐТ) Ñипа tsquery, коÑоÑÑй наÑ
Ð¾Ð´Ð¸Ñ ÑооÑвеÑÑÑвие, ÑолÑко еÑли его опеÑÐ°Ð½Ð´Ñ ÑаÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ñ ÑÑдом и в заданном поÑÑдке. ÐапÑимеÑ:
SELECT to_tsvector('fatal error') @@ to_tsquery('fatal <-> error');
?column?
----------
t
SELECT to_tsvector('error is not fatal') @@ to_tsquery('fatal <-> error');
?column?
----------
f Ðолее обÑÐ°Ñ Ð²ÐµÑÑÐ¸Ñ Ð¾Ð¿ÐµÑаÑоÑа ÐÐ ÐÐШÐСТÐУÐТ Ð¸Ð¼ÐµÐµÑ Ð²Ð¸Ð´ <, где N>N â Ñелое ÑиÑло, вÑÑажаÑÑее ÑазноÑÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð¿Ð¾Ð·Ð¸ÑиÑми найденнÑÑ
лекÑем. ÐапиÑÑ <1> ÑавнознаÑна <->, Ñогда как <2> допÑÑÐºÐ°ÐµÑ ÑÑÑеÑÑвование Ñовно одной лекÑÐµÐ¼Ñ Ð¼ÐµÐ¶Ð´Ñ ÑÑими лекÑемами и Ñ. д. ФÑнкÑÐ¸Ñ phraseto_tsquery задейÑÑвÑÐµÑ ÑÑÐ¾Ñ Ð¾Ð¿ÐµÑаÑÐ¾Ñ Ð´Ð»Ñ ÐºÐ¾Ð½ÑÑÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ tsquery, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð¼Ð½Ð¾Ð³Ð¾ÑловнÑÑ ÑÑазÑ, вклÑÑаÑÑÑÑ Ð² ÑÐµÐ±Ñ ÑÑоп-Ñлова. ÐапÑимеÑ:
SELECT phraseto_tsquery('cats ate rats');
phraseto_tsquery
-------------------------------
'cat' <-> 'ate' <-> 'rat'
SELECT phraseto_tsquery('the cats ate the rats');
phraseto_tsquery
-------------------------------
'cat' <-> 'ate' <2> 'rat'ÐÑобÑй ÑлÑÑай, коÑоÑÑй иногда бÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½, пÑедÑÑавлÑÐµÑ Ñобой запиÑÑ <0>, ÑÑебÑÑÑаÑ, ÑÑÐ¾Ð±Ñ Ð¾Ð±Ð¾Ð¸Ð¼ лекÑемам ÑооÑвеÑÑÑвовало одно Ñлово.
СоÑеÑанием опеÑаÑоÑов tsquery можно ÑпÑавлÑÑÑ, пÑименÑÑ Ñкобки. Ðез Ñкобок опеÑаÑоÑÑ Ð¸Ð¼ÐµÑÑ ÑледÑÑÑие пÑиоÑиÑеÑÑ, в поÑÑдке возÑаÑÑаниÑ: |, &, <-> и ÑамÑй пÑиоÑиÑеÑнÑй â !.
СÑÐ¾Ð¸Ñ Ð¾ÑмеÑиÑÑ, ÑÑо опеÑаÑоÑÑ Ð/ÐÐÐ/ÐРимеÑÑ Ð½ÐµÑколÑко дÑÑгое знаÑение, когда они пÑименÑÑÑÑÑ Ð² аÑгÑменÑаÑ
опеÑаÑоÑа ÐÐ ÐÐШÐСТÐУÐТ, Ñак как в ÑÑом ÑлÑÑае Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение ÑоÑÐ½Ð°Ñ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ ÑовпадениÑ. ÐапÑимеÑ, обÑÑÐ½Ð¾Ð¼Ñ !x ÑооÑвеÑÑÑвÑÑÑ ÑолÑко докÑменÑÑ, не ÑодеÑжаÑие x нигде. Ðо ÑÑÐ»Ð¾Ð²Ð¸Ñ !x <-> y ÑооÑвеÑÑÑвÑÐµÑ y, еÑли оно не ÑледÑÐµÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно за x; пÑи вÑ
ождении x в лÑбом дÑÑгом меÑÑе докÑменÑа он не бÑÐ´ÐµÑ Ð¸ÑклÑÑаÑÑÑÑ Ð¸Ð· ÑаÑÑмоÑÑениÑ. ÐÑÑгой пÑимеÑ: Ð´Ð»Ñ ÑÑÐ»Ð¾Ð²Ð¸Ñ x & y обÑÑно ÑÑебÑеÑÑÑ, ÑÑÐ¾Ð±Ñ Ð¸ x, и y вÑÑÑеÑалиÑÑ Ð² каком-Ñо меÑÑе докÑменÑа, но Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑÐ»Ð¾Ð²Ð¸Ñ (x & y) <-> z ÑÑебÑеÑÑÑ, ÑÑÐ¾Ð±Ñ x и y ÑаÑполагалиÑÑ Ð² одном меÑÑе, непоÑÑедÑÑвенно пеÑед z. Таким обÑазом, ÑÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð¾ÑлиÑаеÑÑÑ Ð¾Ñ x <-> z & y <-> z, коÑоÑÐ¾Ð¼Ñ ÑдовлеÑвоÑÑÑÑ Ð´Ð¾ÐºÑменÑÑ, ÑодеÑжаÑие две оÑделÑнÑе поÑледоваÑелÑноÑÑи x z и y z. (ÐÑÐ¾Ñ ÐºÐ¾Ð½ÐºÑеÑнÑй запÑÐ¾Ñ Ð² Ñаком виде, как он запиÑан, не Ð¸Ð¼ÐµÐµÑ ÑмÑÑла, Ñак как x и y не могÑÑ Ð½Ð°Ñ
одиÑÑÑÑ Ð² одном меÑÑе; но в более ÑложнÑÑ
ÑиÑÑаÑиÑÑ
, напÑимеÑ, Ñ Ñаблонами поиÑка по маÑке, запÑоÑÑ ÑÑого вида могÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ.)
12.1.3. ÐонÑигÑÑаÑии
Ðо ÑÑого Ð¼Ñ ÑаÑÑмаÑÑивали оÑÐµÐ½Ñ Ð¿ÑоÑÑÑе пÑимеÑÑ Ð¿Ð¾Ð¸Ñка ÑекÑÑа. Ðак бÑло ÑпомÑнÑÑо вÑÑе, веÑÑ ÑÑнкÑионал ÑекÑÑового поиÑка позволÑÐµÑ Ð´ÐµÐ»Ð°ÑÑ Ð³Ð¾Ñаздо болÑÑе: пÑопÑÑкаÑÑ Ð¾Ð¿ÑеделÑннÑе Ñлова (ÑÑоп-Ñлова), обÑабаÑÑваÑÑ ÑÐ¸Ð½Ð¾Ð½Ð¸Ð¼Ñ Ð¸ вÑполнÑÑÑ ÑложнÑй анализ Ñлов, напÑимеÑ, вÑделÑÑÑ ÑÑагменÑÑ Ð½Ðµ ÑолÑко по пÑобелам. ÐÑе ÑÑи ÑÑнкÑии ÑпÑавлÑÑÑÑÑ ÐºÐ¾Ð½ÑигÑÑаÑиÑми ÑекÑÑового поиÑка. Ð PostgreSQL еÑÑÑ Ð½Ð°Ð±Ð¾Ñ Ð¿ÑедопÑеделÑннÑÑ
конÑигÑÑаÑий Ð´Ð»Ñ Ð¼Ð½Ð¾Ð³Ð¸Ñ
ÑзÑков, но Ð²Ñ Ñакже можеÑе ÑоздаваÑÑ ÑобÑÑвеннÑе конÑигÑÑаÑии. (ÐÑе доÑÑÑпнÑе конÑигÑÑаÑии можно пÑоÑмоÑÑеÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ \dF в psql.)
ÐодÑ
одÑÑÐ°Ñ ÐºÐ¾Ð½ÑигÑÑаÑÐ¸Ñ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑÑÐµÐ´Ñ Ð²ÑбиÑаеÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ ÑÑÑановки и запиÑÑваеÑÑÑ Ð² паÑамеÑÑе default_text_search_config в postgresql.conf. ÐÑли Ð²Ñ Ð¸ÑполÑзÑеÑе Ð´Ð»Ñ Ð²Ñего клаÑÑеÑа Ð¾Ð´Ð½Ñ ÐºÐ¾Ð½ÑигÑÑаÑÐ¸Ñ ÑекÑÑового поиÑка, вам бÑÐ´ÐµÑ Ð´Ð¾ÑÑаÑоÑно ÑÑого паÑамеÑÑа в postgresql.conf. ÐÑли же ÑÑебÑеÑÑÑ Ð¸ÑполÑзоваÑÑ Ð² клаÑÑеÑе ÑазнÑе конÑигÑÑаÑии, но Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
Ð¾Ð´Ð½Ñ Ð¾Ð¿ÑеделÑннÑÑ, ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ задаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ ALTER DATABASE ... SET. РпÑоÑивном ÑлÑÑае конÑигÑÑаÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ вÑбÑаÑÑ Ð² ÑамкаÑ
ÑеанÑа, опÑеделив паÑамеÑÑ default_text_search_config.
У каждой ÑÑнкÑии ÑекÑÑового поиÑка, завиÑÑÑей Ð¾Ñ ÐºÐ¾Ð½ÑигÑÑаÑии, еÑÑÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑнÑй аÑгÑÐ¼ÐµÐ½Ñ regconfig, в коÑоÑом можно Ñвно ÑказаÑÑ ÐºÐ¾Ð½ÑигÑÑаÑÐ¸Ñ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑÑнкÑии. ÐнаÑение default_text_search_config иÑполÑзÑеÑÑÑ, ÑолÑко когда ÑÑÐ¾Ñ Ð°ÑгÑÐ¼ÐµÐ½Ñ Ð¾Ð¿ÑÑен.
ÐÐ»Ñ ÑпÑоÑÐµÐ½Ð¸Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½ÑигÑÑаÑий ÑекÑÑового поиÑка они ÑÑÑоÑÑÑÑ Ð¸Ð· более пÑоÑÑÑÑ Ð¾Ð±ÑекÑов. Ð PostgreSQL еÑÑÑ ÑеÑÑÑе Ñипа ÑÐ°ÐºÐ¸Ñ Ð¾Ð±ÑекÑов:
ÐнализаÑоÑÑ ÑекÑÑового поиÑка ÑазделÑÑÑ Ð´Ð¾ÐºÑÐ¼ÐµÐ½Ñ Ð½Ð° ÑÑагменÑÑ Ð¸ клаÑÑиÑиÑиÑÑÑÑ Ð¸Ñ (напÑимеÑ, как Ñлова или ÑиÑла).
СловаÑи ÑекÑÑового поиÑка пÑиводÑÑ ÑÑагменÑÑ Ðº ноÑмализованной ÑоÑме и оÑбÑаÑÑваÑÑ ÑÑоп-Ñлова.
Ð¨Ð°Ð±Ð»Ð¾Ð½Ñ ÑекÑÑового поиÑка пÑедоÑÑавлÑÑÑ ÑÑнкÑии, обÑазÑÑÑие ÑеализаÑÐ¸Ñ ÑловаÑей. (ÐÑи Ñоздании ÑловаÑÑ Ð¿ÑоÑÑо задаÑÑÑÑ Ñаблон и Ð½Ð°Ð±Ð¾Ñ Ð¿Ð°ÑамеÑÑов Ð´Ð»Ñ Ð½ÐµÐ³Ð¾.)
ÐонÑигÑÑаÑии ÑекÑÑового поиÑка вÑбиÑаÑÑ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°ÑÐ¾Ñ Ð¸ Ð½Ð°Ð±Ð¾Ñ ÑловаÑей, коÑоÑÑй бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ð½Ð¾ÑмализаÑии ÑÑагменÑов, вÑданнÑÑ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°ÑоÑом.
ÐнализаÑоÑÑ Ð¸ ÑÐ°Ð±Ð»Ð¾Ð½Ñ ÑекÑÑового поиÑка ÑÑÑоÑÑÑÑ Ð¸Ð· низкоÑÑовневÑÑ
ÑÑнкÑий на ÑзÑке C; ÑÑÐ¾Ð±Ñ ÑоздаÑÑ Ð¸Ñ
, нÑжно пÑогÑаммиÑоваÑÑ Ð½Ð° C, а подклÑÑиÑÑ Ð¸Ñ
к базе даннÑÑ
Ð¼Ð¾Ð¶ÐµÑ ÑолÑко ÑÑпеÑполÑзоваÑелÑ. (РподкаÑалоге contrib/ инÑÑаллÑÑии PostgreSQL можно найÑи пÑимеÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ
анализаÑоÑов и Ñаблонов.) Так как ÑловаÑи и конÑигÑÑаÑии пÑедÑÑавлÑÑÑ Ñобой пÑоÑÑо набоÑÑ Ð¿Ð°ÑамеÑÑов, ÑвÑзÑваÑÑие анализаÑоÑÑ Ð¸ ÑаблонÑ, иÑ
можно ÑоздаваÑÑ, не Ð¸Ð¼ÐµÑ Ð°Ð´Ð¼Ð¸Ð½Ð¸ÑÑÑаÑивнÑÑ
пÑав. Ðалее в ÑÑой главе бÑдÑÑ Ð¿ÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð¿ÑимеÑÑ Ð¸Ñ
ÑозданиÑ.