12.6. СловаÑи
СловаÑи полноÑекÑÑового поиÑка пÑедназнаÑÐµÐ½Ñ Ð´Ð»Ñ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ ÑÑоп-Ñлов (Ñлов, коÑоÑÑе не Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÑиÑÑваÑÑÑÑ Ð¿Ñи поиÑке) и ноÑмализаÑии Ñлов, ÑÑÐ¾Ð±Ñ ÑазнÑе ÑловоÑоÑÐ¼Ñ ÑÑиÑалиÑÑ ÑовпадаÑÑими. УÑпеÑно ноÑмализованное Ñлово назÑваеÑÑÑ Ð»ÐµÐºÑемой. ÐоÑмализаÑÐ¸Ñ Ð¸ иÑклÑÑение ÑÑоп-Ñлов не ÑолÑко ÑлÑÑÑÐ°ÐµÑ ÐºÐ°ÑеÑÑво поиÑка, но и ÑменÑÑÐ°ÐµÑ ÑÐ°Ð·Ð¼ÐµÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾ÐºÑменÑа в ÑоÑмаÑе tsvector, и, как ÑледÑÑвие, ÑвелиÑÐ¸Ð²Ð°ÐµÑ Ð±ÑÑÑÑодейÑÑвие. ÐоÑмализаÑÐ¸Ñ Ð½Ðµ вÑегда Ð¸Ð¼ÐµÐµÑ Ð»Ð¸Ð½Ð³Ð²Ð¸ÑÑиÑеÑкий ÑмÑÑл, обÑÑно она завиÑÐ¸Ñ Ð¾Ñ ÑÑебований пÑиложениÑ.
ÐеÑколÑко пÑимеÑов ноÑмализаÑии:
ÐингвиÑÑиÑеÑÐºÐ°Ñ Ð½Ð¾ÑмализаÑÐ¸Ñ â ÑловаÑи Ispell пÑÑаÑÑÑÑ ÑвеÑÑи Ñлова на Ð²Ñ Ð¾Ð´Ðµ к ноÑмализованной ÑоÑме, а ÑÑеммеÑÑ ÑбиÑаÑÑ Ð¾ÐºÐ¾Ð½ÑÐ°Ð½Ð¸Ñ Ñлов
ÐдÑеÑа URL могÑÑ Ð±ÑÑÑ ÐºÐ°Ð½Ð¾Ð½Ð¸Ð·Ð¸ÑованÑ, ÑÑÐ¾Ð±Ñ Ð½Ð°Ð¿ÑÐ¸Ð¼ÐµÑ ÑледÑÑÑие адÑеÑа ÑÑиÑалиÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñми:
http://www.pgsql.ru/db/mw/index.html
http://www.pgsql.ru/db/mw/
http://www.pgsql.ru/db/../db/mw/index.html
ÐÐ°Ð·Ð²Ð°Ð½Ð¸Ñ ÑвеÑов могÑÑ Ð±ÑÑÑ Ð·Ð°Ð¼ÐµÐ½ÐµÐ½Ñ Ð¸Ñ ÑеÑÑнадÑаÑеÑиÑнÑми знаÑениÑми, напÑимеÑ
red, green, blue, magenta -> FF0000, 00FF00, 0000FF, FF00FFÐÑи индекÑиÑовании ÑиÑел можно оÑбÑоÑиÑÑ ÑиÑÑÑ Ð² дÑобной ÑаÑÑи Ð´Ð»Ñ ÑокÑаÑÐµÐ½Ð¸Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑва вÑевозможнÑÑ ÑиÑел, ÑÑÐ¾Ð±Ñ Ð½Ð°Ð¿ÑÐ¸Ð¼ÐµÑ 3.14159265359, 3.1415926 и 3.14 ÑÑали одинаковÑми поÑле ноÑмализаÑии, пÑи коÑоÑой поÑле ÑоÑки оÑÑанÑÑÑÑ ÑолÑко две ÑиÑÑÑ.
СловаÑÑ â ÑÑо пÑогÑамма, коÑоÑÐ°Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð½Ð° Ð²Ñ Ð¾Ð´ ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ Ð¸ возвÑаÑаеÑ:
маÑÑив лекÑем, еÑли Ð²Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ Ð¸Ð·Ð²ÐµÑÑен в ÑловаÑе (замеÑÑÑе, один ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑодиÑÑ Ð½ÐµÑколÑко лекÑем)
Ð¾Ð´Ð½Ñ Ð»ÐµÐºÑÐµÐ¼Ñ Ñ ÑÑÑановленнÑм Ñлагом
TSL_FILTERÐ´Ð»Ñ Ð·Ð°Ð¼ÐµÐ½Ñ Ð¸ÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑÑагменÑа новÑм, ÑÑÐ¾Ð±Ñ ÑледÑÑÑие ÑловаÑи ÑабоÑали Ñ Ð½Ð¾Ð²Ñм ваÑианÑом (ÑловаÑÑ, коÑоÑÑй Ð´ÐµÐ»Ð°ÐµÑ ÑÑо, назÑваеÑÑÑ ÑилÑÑÑÑÑÑим ÑловаÑÑм)пÑÑÑой маÑÑив, еÑли ÑловаÑÑ Ð²Ð¾ÑпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑÑÐ¾Ñ ÑÑагменÑ, но ÑÑиÑÐ°ÐµÑ ÐµÐ³Ð¾ ÑÑоп-Ñловом
NULL, еÑли ÑловаÑÑ Ð½Ðµ воÑпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¿Ð¾Ð»ÑÑеннÑй ÑÑагменÑ
Ð Postgres Pro вÑÑÑÐ¾ÐµÐ½Ñ ÑÑандаÑÑнÑе ÑловаÑи Ð´Ð»Ñ Ð¼Ð½Ð¾Ð³Ð¸Ñ
ÑзÑков. ÐÑÑÑ Ñакже неÑколÑко пÑедопÑеделÑннÑÑ
Ñаблонов, на оÑновании коÑоÑÑÑ
можно ÑоздаваÑÑ Ð½Ð¾Ð²Ñе ÑловаÑи Ñ Ð¸Ð·Ð¼ÐµÐ½ÑннÑми паÑамеÑÑами. ÐÑе ÑÑи ÑÐ°Ð±Ð»Ð¾Ð½Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ñ Ð½Ð¸Ð¶Ðµ. ÐÑли же ни один из ниÑ
не подÑ
одиÑ, можно ÑоздаÑÑ Ð¸ Ñвои ÑобÑÑвеннÑе ÑаблонÑ. СооÑвеÑÑÑвÑÑÑие пÑимеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ найÑи в каÑалоге contrib/ инÑÑаллÑÑии Postgres Pro.
ÐонÑигÑÑаÑÐ¸Ñ ÑекÑÑового поиÑка ÑвÑзÑÐ²Ð°ÐµÑ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°ÑÐ¾Ñ Ñ Ð½Ð°Ð±Ð¾Ñом ÑловаÑей, коÑоÑÑе бÑдÑÑ Ð¾Ð±ÑабаÑÑваÑÑ Ð²ÑделеннÑе им ÑÑагменÑÑ. ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñипа ÑÑагменÑов, вÑданнÑÑ
анализаÑоÑом, в конÑигÑÑаÑии задаÑÑÑÑ Ð¾ÑделÑнÑй ÑпиÑок ÑловаÑей. ÐайденнÑй анализаÑоÑом ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ Ð¿ÑоÑ
Ð¾Ð´Ð¸Ñ ÑеÑез вÑе ÑловаÑи по поÑÑдкÑ, пока какой-либо ÑловаÑÑ Ð½Ðµ ÑÐ²Ð¸Ð´Ð¸Ñ Ð² нÑм знакомое Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ Ñлово. ÐÑли он окажеÑÑÑ ÑÑоп-Ñловом или его не ÑаÑÐ¿Ð¾Ð·Ð½Ð°ÐµÑ Ð½Ð¸ один ÑловаÑÑ, ÑÑÐ¾Ñ ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ Ð½Ðµ бÑÐ´ÐµÑ ÑÑиÑÑваÑÑÑÑ Ð¿Ñи индекÑаÑии и поиÑке. ÐбÑÑно ÑезÑлÑÑÐ°Ñ Ð¾Ð¿ÑеделÑÐµÑ Ð¿ÐµÑвÑй же ÑловаÑÑ, коÑоÑÑй возвÑаÑÐ°ÐµÑ Ð½Ðµ NULL, и оÑÑалÑнÑе ÑловаÑи Ñже не пÑовеÑÑÑÑÑÑ; однако ÑилÑÑÑÑÑÑий ÑловаÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¼ÐµÐ½Ð¸ÑÑ Ð¿Ð¾Ð»ÑÑенное Ñлово дÑÑгим, коÑоÑое и бÑÐ´ÐµÑ Ð¿ÐµÑедано ÑледÑÑÑим ÑловаÑÑм.
ÐбÑее пÑавило наÑÑÑойки ÑпиÑка ÑловаÑей заклÑÑаеÑÑÑ Ð² Ñом, ÑÑÐ¾Ð±Ñ Ð¿Ð¾ÑÑавиÑÑ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ ÑаÑÑнÑе и ÑпеÑиÑиÑеÑкие ÑловаÑи в наÑале, заÑем пеÑеÑиÑлиÑÑ Ð±Ð¾Ð»ÐµÐµ обÑие и законÑиÑÑ ÑамÑм обÑим ÑловаÑÑм, напÑÐ¸Ð¼ÐµÑ ÑÑеммеÑом Snowball или ÑловаÑÑм simple, коÑоÑÑй ÑаÑпознаÑÑ Ð²ÑÑ. ÐапÑимеÑ, Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка по Ñеме аÑÑÑономии (конÑигÑÑаÑÐ¸Ñ astro_en) Ñип ÑÑагменÑов asciiword (Ñлово из бÑкв ASCII) можно ÑвÑзаÑÑ Ñо ÑловаÑÑм Ñинонимов аÑÑÑономиÑеÑкиÑ
ÑеÑминов, заÑем Ñ Ð¾Ð±ÑÑнÑм английÑким ÑловаÑÑм и Ð½Ð°ÐºÐ¾Ð½ÐµÑ Ñо ÑÑеммеÑом английÑкиÑ
оконÑаний Snowball:
ALTER TEXT SEARCH CONFIGURATION astro_en
ADD MAPPING FOR asciiword WITH astrosyn, english_ispell, english_stem;ФилÑÑÑÑÑÑий ÑловаÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ вклÑÑиÑÑ Ð² лÑбом меÑÑе ÑпиÑка, кÑоме конÑа, где он бÑÐ´ÐµÑ Ð±ÐµÑполезен. ФилÑÑÑÑÑÑие ÑловаÑи бÑваÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ Ð´Ð»Ñ ÑаÑÑиÑной ноÑмализаÑии Ñлов и ÑпÑоÑÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ñи ÑледÑÑÑÐ¸Ñ ÑловаÑей. ÐапÑимеÑ, ÑилÑÑÑÑÑÑий ÑловаÑÑ Ð¼Ð¾Ð¶ÐµÑ ÑдалиÑÑ Ð¸Ð· ÑекÑÑа диакÑиÑиÑеÑкие знаки, как ÑÑо Ð´ÐµÐ»Ð°ÐµÑ Ð¼Ð¾Ð´ÑÐ»Ñ unaccent.
12.6.1. СÑоп-Ñлова
СÑоп-Ñловами назÑваÑÑÑÑ Ñлова, коÑоÑÑе вÑÑÑеÑаÑÑÑÑ Ð¾ÑÐµÐ½Ñ ÑаÑÑо, пÑакÑиÑеÑки в каждом докÑменÑе, и поÑÑÐ¾Ð¼Ñ Ð½Ðµ имеÑÑ ÑазлиÑиÑелÑной ÑенноÑÑи. Таким обÑазом, пÑи полноÑекÑÑовом поиÑке иÑ
можно игноÑиÑоваÑÑ. ÐапÑимеÑ, в каждом английÑком ÑекÑÑе ÑодеÑжаÑÑÑ Ð°ÑÑикли a и the, Ñак ÑÑо Ñ
ÑаниÑÑ Ð¸Ñ
в индекÑе беÑÑмÑÑленно. Ðднако ÑÑоп-Ñлова влиÑÑÑ Ð½Ð° позиÑии лекÑем в знаÑении tsvector, Ð¾Ñ Ñего, в ÑÐ²Ð¾Ñ Ð¾ÑеÑедÑ, завиÑÐ¸Ñ ÑанжиÑование:
SELECT to_tsvector('english', 'in the list of stop words');
to_tsvector
----------------------------
'list':3 'stop':5 'word':6
Ð ÑезÑлÑÑаÑе оÑÑÑÑÑÑвÑÑÑ Ð¿Ð¾Ð·Ð¸Ñии 1,2,4, поÑÐ¾Ð¼Ñ ÑÑо ÑÑагменÑÑ Ð² ÑÑÐ¸Ñ Ð¿Ð¾Ð·Ð¸ÑиÑÑ Ð¾ÐºÐ°Ð·Ð°Ð»Ð¸ÑÑ ÑÑоп-Ñловами. Ранги, вÑÑиÑленнÑе Ð´Ð»Ñ Ð´Ð¾ÐºÑменÑов Ñо ÑÑоп-Ñловами и без Ð½Ð¸Ñ , могÑÑ Ð·Ð½Ð°ÑиÑелÑно ÑазлиÑаÑÑÑÑ:
SELECT ts_rank_cd (to_tsvector('english', 'in the list of stop words'), to_tsquery('list & stop'));
ts_rank_cd
------------
0.05
SELECT ts_rank_cd (to_tsvector('english', 'list stop words'), to_tsquery('list & stop'));
ts_rank_cd
------------
0.1
Ðак именно обÑабаÑÑваÑÑ ÑÑоп-Ñлова, опÑеделÑÐµÑ Ñам ÑловаÑÑ. ÐапÑимеÑ, ÑловаÑи ispell ÑнаÑала ноÑмализÑÑÑ Ñлова, а заÑем пÑоÑмаÑÑиваÑÑ ÑпиÑок ÑÑоп-Ñлов, Ñогда как ÑÑеммеÑÑ Snowball пÑоÑмаÑÑиваÑÑ Ñвой ÑпиÑок ÑÑоп-Ñлов в пеÑвÑÑ Ð¾ÑеÑедÑ. ÐÑо ÑазлиÑие в поведении обÑÑÑнÑеÑÑÑ ÑÑÑемлением ÑменÑÑиÑÑ ÑÑм.
12.6.2. ÐÑоÑÑой ÑловаÑÑ
РабоÑа Ñаблона ÑловаÑей simple ÑводиÑÑÑ Ðº пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ñ
одного ÑÑагменÑа в нижний ÑегиÑÑÑ Ð¸ пÑовеÑки ÑезÑлÑÑаÑа по ÑÐ°Ð¹Ð»Ñ Ñо ÑпиÑком ÑÑоп-Ñлов. ÐÑли ÑÑо Ñлово наÑ
одиÑÑÑ Ð² Ñайле, ÑловаÑÑ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð¿ÑÑÑой маÑÑив и ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ Ð¸ÑклÑÑаеÑÑÑ Ð¸Ð· далÑнейÑего ÑаÑÑмоÑÑениÑ. РпÑоÑивном ÑлÑÑае ÑловаÑÑ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð² каÑеÑÑве ноÑмализованной лекÑÐµÐ¼Ñ Ñлово в нижнем ÑегиÑÑÑе. ÐÑÐ¾Ñ ÑловаÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ наÑÑÑоиÑÑ Ð¸ Ñак, ÑÑÐ¾Ð±Ñ Ð²Ñе Ñлова, кÑоме ÑÑоп-Ñлов, ÑÑиÑалиÑÑ Ð½ÐµÐ¾Ð¿Ð¾Ð·Ð½Ð°Ð½Ð½Ñми и пеÑедавалиÑÑ ÑледÑÑÑÐµÐ¼Ñ ÑловаÑÑ Ð² ÑпиÑке.
ÐпÑеделиÑÑ ÑловаÑÑ Ð½Ð° оÑнове Ñаблона simple можно Ñак:
CREATE TEXT SEARCH DICTIONARY public.simple_dict (
TEMPLATE = pg_catalog.simple,
STOPWORDS = english
); ÐдеÑÑ english â базовое Ð¸Ð¼Ñ Ñайла Ñо ÑÑоп-Ñловами. ÐолнÑм именем Ñайла бÑÐ´ÐµÑ $SHAREDIR/tsearch_data/english.stop, где $SHAREDIR ÑказÑÐ²Ð°ÐµÑ Ð½Ð° каÑалог Ñ Ð¾Ð±Ñими даннÑми Postgres Pro, ÑаÑÑо ÑÑо /usr/local/share/postgresql (ÑоÑно ÑзнаÑÑ ÐµÐ³Ð¾ можно Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ pg_config --sharedir). ÐÑÐ¾Ñ ÑекÑÑовÑй Ñайл должен ÑодеÑжаÑÑ Ð¿ÑоÑÑо ÑпиÑок Ñлов, по Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑÐ»Ð¾Ð²Ñ Ð² ÑÑÑоке. ÐÑÑÑÑе ÑÑÑоки и окÑÑжаÑÑие пÑÐ¾Ð±ÐµÐ»Ñ Ð¸Ð³Ð½Ð¾ÑиÑÑÑÑÑÑ, вÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¿ÐµÑеводÑÑÑÑ Ð² нижний ÑегиÑÑÑ Ð¸ на ÑÑом обÑабоÑка Ñайла заканÑиваеÑÑÑ.
ТепеÑÑ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ пÑовеÑиÑÑ Ð½Ð°Ñ ÑловаÑÑ:
SELECT ts_lexize('public.simple_dict', 'YeS');
ts_lexize
-----------
{yes}
SELECT ts_lexize('public.simple_dict', 'The');
ts_lexize
-----------
{}
ÐÑ Ñакже можем наÑÑÑоиÑÑ ÑловаÑÑ Ñак, ÑÑÐ¾Ð±Ñ Ð¾Ð½ возвÑаÑал NULL вмеÑÑо Ñлова в нижнем ÑегиÑÑÑе, еÑли оно не наÑ
одиÑÑÑ Ð² Ñайле ÑÑоп-Ñлов. ÐÐ»Ñ ÑÑого нÑжно пÑиÑвоиÑÑ Ð¿Ð°ÑамеÑÑÑ Accept знаÑение false. ÐÑÐ¾Ð´Ð¾Ð»Ð¶Ð°Ñ Ð½Ð°Ñ Ð¿ÑимеÑ:
ALTER TEXT SEARCH DICTIONARY public.simple_dict ( Accept = false );
SELECT ts_lexize('public.simple_dict', 'YeS');
ts_lexize
-----------
SELECT ts_lexize('public.simple_dict', 'The');
ts_lexize
-----------
{}
Со знаÑением Accept = true (по ÑмолÑаниÑ) ÑловаÑÑ simple Ð¸Ð¼ÐµÐµÑ ÑмÑÑл вклÑÑаÑÑ ÑолÑко в конÑе ÑпиÑка ÑловаÑей, Ñак как он никогда не пеÑедаÑÑ ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ ÑледÑÑÑÐµÐ¼Ñ ÑловаÑÑ. РнапÑоÑив, Accept = false Ð¸Ð¼ÐµÐµÑ ÑмÑÑл, ÑолÑко еÑли за ним ÑледÑÐµÑ ÐµÑÑ Ð¼Ð¸Ð½Ð¸Ð¼Ñм один ÑловаÑÑ.
Ðнимание
ÐолÑÑинÑÑво ÑловаÑей ÑабоÑаÑÑ Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑми Ñайлами, напÑимеÑ, Ñайлами ÑÑоп-Ñлов. СодеÑжимое ÑÑÐ¸Ñ Ñайлов должно имеÑÑ ÐºÐ¾Ð´Ð¸ÑÐ¾Ð²ÐºÑ UTF-8. ÐÑли база даннÑÑ ÑабоÑÐ°ÐµÑ Ð² дÑÑгой кодиÑовке, они бÑдÑÑ Ð¿ÐµÑÐµÐ²ÐµÐ´ÐµÐ½Ñ Ð² неÑ, когда ÑеÑÐ²ÐµÑ Ð±ÑÐ´ÐµÑ Ð·Ð°Ð³ÑÑжаÑÑ Ð¸Ñ .
Ðнимание
ÐбÑÑно в ÑамкаÑ
одного ÑеанÑа дополниÑелÑнÑй Ñайл ÑловаÑÑ Ð·Ð°Ð³ÑÑжаеÑÑÑ ÑолÑко один Ñаз, пÑи пеÑвом иÑполÑзовании. ÐÑли же Ð²Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñе его и заÑ
оÑиÑе, ÑÑÐ¾Ð±Ñ ÑÑÑеÑÑвÑÑÑие ÑеанÑÑ ÑабоÑали Ñ Ð½Ð¾Ð²Ñм ÑодеÑжимÑм, вÑполниÑе Ð´Ð»Ñ ÑÑого ÑловаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ALTER TEXT SEARCH DICTIONARY. ÐÑо обновление ÑловаÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Â«ÑикÑивнÑм», ÑакÑиÑеÑки не менÑÑÑим знаÑÐµÐ½Ð¸Ñ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ
паÑамеÑÑов.
12.6.3. СловаÑÑ Ñинонимов
ÐÑÐ¾Ñ Ñаблон ÑловаÑей иÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑловаÑей, заменÑÑÑиÑ
Ñлова Ñинонимами. СловоÑоÑеÑÐ°Ð½Ð¸Ñ Ñакие ÑловаÑи не поддеÑживаÑÑ (иÑполÑзÑйÑе Ð´Ð»Ñ ÑÑого ÑезаÑÑÑÑ (ÐодÑаздел 12.6.4)). СловаÑÑ Ñинонимов Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð¼Ð¾ÑÑ Ð² пÑеодолении лингвиÑÑиÑеÑкиÑ
пÑоблем, напÑимеÑ, не даÑÑ ÑÑеммеÑÑ Ð°Ð½Ð³Ð»Ð¸Ð¹Ñкого ÑменÑÑиÑÑ Ñлово «Paris» до «pari». ÐÐ»Ñ ÑÑого доÑÑаÑоÑно помеÑÑиÑÑ Ð² ÑловаÑÑ Ñинонимов ÑÑÑÐ¾ÐºÑ Paris paris и поÑÑавиÑÑ ÑÑÐ¾Ñ ÑловаÑÑ Ð¿ÐµÑед ÑловаÑÑм english_stem. ÐапÑимеÑ:
SELECT * FROM ts_debug('english', 'Paris');
alias | description | token | dictionaries | dictionary | lexemes
-----------+-----------------+-------+----------------+--------------+---------
asciiword | Word, all ASCII | Paris | {english_stem} | english_stem | {pari}
CREATE TEXT SEARCH DICTIONARY my_synonym (
TEMPLATE = synonym,
SYNONYMS = my_synonyms
);
ALTER TEXT SEARCH CONFIGURATION english
ALTER MAPPING FOR asciiword
WITH my_synonym, english_stem;
SELECT * FROM ts_debug('english', 'Paris');
alias | description | token | dictionaries | dictionary | lexemes
-----------+-----------------+-------+---------------------------+------------+---------
asciiword | Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {paris}
Шаблон synonym пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÐµÐ´Ð¸Ð½ÑÑвеннÑй паÑамеÑÑ, SYNONYMS, в коÑоÑом задаÑÑÑÑ Ð±Ð°Ð·Ð¾Ð²Ð¾Ðµ Ð¸Ð¼Ñ ÐµÐ³Ð¾ Ñайла конÑигÑÑаÑии â в данном пÑимеÑе ÑÑо my_synonyms. ÐолнÑм именем Ñайла бÑÐ´ÐµÑ $SHAREDIR/tsearch_data/my_synonyms.syn (где $SHAREDIR ÑказÑÐ²Ð°ÐµÑ Ð½Ð° каÑалог обÑиÑ
даннÑÑ
Postgres Pro). СодеÑжимое ÑÑого Ñайла Ð´Ð¾Ð»Ð¶Ð½Ñ ÑоÑÑавлÑÑÑ ÑÑÑоки Ñ Ð´Ð²ÑÐ¼Ñ Ñловами в каждой (пеÑвое â заменÑемое Ñлово, а вÑоÑое â его Ñиноним), ÑазделÑннÑми пÑобелами. ÐÑÑÑÑе ÑÑÑоки и окÑÑжаÑÑие пÑÐ¾Ð±ÐµÐ»Ñ Ð¿Ñи ÑазбоÑе ÑÑого Ñайла игноÑиÑÑÑÑÑÑ.
Шаблон synonym Ñакже пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑнÑй паÑамеÑÑ CaseSensitive, коÑоÑÑй по ÑмолÑÐ°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение false. Ðогда CaseSensitive Ñавен false, Ñлова в Ñайле Ñинонимов пеÑеводÑÑÑÑ Ð² нижний ÑегиÑÑÑ, вмеÑÑе Ñ Ð¿ÑовеÑÑемÑми ÑÑагменÑами. ÐÑли же он не Ñавен true, ÑегиÑÑÑ Ñлов в Ñайле и пÑовеÑÑемÑÑ
ÑÑагменÑов не менÑÑÑÑÑ, они ÑÑавниваÑÑÑÑ Â«ÐºÐ°Ðº еÑÑÑ».
РконÑе Ñинонима в ÑÑом Ñайле можно добавиÑÑ Ð·Ð²ÑздоÑÐºÑ (*), Ñогда ÑÑÐ¾Ñ Ñиноним бÑÐ´ÐµÑ ÑаÑÑмаÑÑиваÑÑÑÑ ÐºÐ°Ðº пÑеÑикÑ. ÐÑа звÑздоÑка бÑÐ´ÐµÑ Ð¸Ð³Ð½Ð¾ÑиÑоваÑÑÑÑ Ð² to_tsvector(), но to_tsquery() Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ ÑезÑлÑÑаÑ, добавив в него маÑÐºÐµÑ ÑопоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÑеÑикÑа (Ñм. ÐодÑаздел 12.3.2). ÐапÑимеÑ, пÑедположим, ÑÑо Ñайл $SHAREDIR/tsearch_data/synonym_sample.syn Ð¸Ð¼ÐµÐµÑ ÑледÑÑÑее ÑодеÑжание:
postgres pgsql postgresql pgsql postgre pgsql gogle googl indices index*
С ним Ð¼Ñ Ð¿Ð¾Ð»ÑÑим Ñакие ÑезÑлÑÑаÑÑ:
mydb=# CREATE TEXT SEARCH DICTIONARY syn (template=synonym, synonyms='synonym_sample');
mydb=# SELECT ts_lexize('syn', 'indices');
ts_lexize
-----------
{index}
(1 row)
mydb=# CREATE TEXT SEARCH CONFIGURATION tst (copy=simple);
mydb=# ALTER TEXT SEARCH CONFIGURATION tst ALTER MAPPING FOR asciiword WITH syn;
mydb=# SELECT to_tsvector('tst', 'indices');
to_tsvector
-------------
'index':1
(1 row)
mydb=# SELECT to_tsquery('tst', 'indices');
to_tsquery
------------
'index':*
(1 row)
mydb=# SELECT 'indexes are very useful'::tsvector;
tsvector
---------------------------------
'are' 'indexes' 'useful' 'very'
(1 row)
mydb=# SELECT 'indexes are very useful'::tsvector @@ to_tsquery('tst', 'indices');
?column?
----------
t
(1 row)
12.6.4. ТезаÑÑÑÑ
ТезаÑÑÑÑ (или ÑокÑаÑÑнно TZ) ÑодеÑÐ¶Ð¸Ñ Ð½Ð°Ð±Ð¾Ñ Ñлов и инÑоÑмаÑÐ¸Ñ Ð¾ ÑвÑзÑÑ Ñлов и ÑловоÑоÑеÑаний, Ñо еÑÑÑ Ð±Ð¾Ð»ÐµÐµ ÑиÑокие понÑÑÐ¸Ñ (Broader Terms, BT), более Ñзкие понÑÑÐ¸Ñ (Narrow Terms, NT), пÑедпоÑиÑаемÑе названиÑ, иÑклÑÑаемÑе названиÑ, ÑвÑзаннÑе понÑÑÐ¸Ñ Ð¸ Ñ. д.
РоÑновном ÑезаÑÑÑÑ Ð·Ð°Ð¼ÐµÐ½ÑÐµÑ Ð¸ÑклÑÑаемÑе Ñлова и ÑловоÑоÑеÑÐ°Ð½Ð¸Ñ Ð¿ÑедпоÑиÑаемÑми и Ð¼Ð¾Ð¶ÐµÑ Ñакже ÑÐ¾Ñ ÑаниÑÑ Ð¸ÑÑ Ð¾Ð´Ð½Ñе Ñлова Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑаÑии. ТекÑÑÐ°Ñ ÑеализаÑÐ¸Ñ ÑезаÑÑÑÑа в Postgres Pro пÑедÑÑавлÑÐµÑ Ñобой ÑаÑÑиÑение ÑловаÑÑ Ñинонимов Ñ Ð¿Ð¾Ð´Ð´ÐµÑжкой ÑÑаз. ÐонÑигÑÑаÑÐ¸Ñ ÑезаÑÑÑÑа опÑеделÑеÑÑÑ Ñайлом ÑледÑÑÑего ÑоÑмаÑа:
# ÑÑо комменÑаÑий обÑÐ°Ð·ÐµÑ Ñлов(а) : индекÑиÑÑемÑе Ñлова дÑÑгой обÑÐ°Ð·ÐµÑ Ñлов(а) : дÑÑгие индекÑиÑÑемÑе Ñлова ...
ÐдеÑÑ Ð´Ð²Ð¾ÐµÑоÑие (:) ÑлÑÐ¶Ð¸Ñ ÑазделиÑелем Ð¼ÐµÐ¶Ð´Ñ Ð¸ÑÑ
одной ÑÑазой и ÐµÑ Ð·Ð°Ð¼ÐµÐ½Ð¾Ð¹.
ÐÑежде Ñем пÑовеÑÑÑÑ ÑооÑвеÑÑÑвие ÑÑаз, ÑезаÑÑÑÑ Ð½Ð¾ÑмализÑÐµÑ Ñайл конÑигÑÑаÑии, иÑполÑзÑÑ Ð²Ð½ÑÑÑенний ÑловаÑÑ (коÑоÑÑй ÑказÑваеÑÑÑ Ð² конÑигÑÑаÑии ÑловаÑÑ-ÑезаÑÑÑÑа). ÐÑÐ¾Ñ Ð²Ð½ÑÑÑенний ÑловаÑÑ Ð´Ð»Ñ ÑезаÑÑÑÑа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑолÑко одним. ÐÑли он не ÑÐ¼Ð¾Ð¶ÐµÑ ÑаÑпознаÑÑ ÐºÐ°ÐºÐ¾Ðµ-либо Ñлово, пÑоизойдÑÑ Ð¾Ñибка. Ð ÑÑом ÑлÑÑае необÑ
одимо либо иÑклÑÑиÑÑ ÑÑо Ñлово, либо добавиÑÑ ÐµÐ³Ð¾ во внÑÑÑенний ÑловаÑÑ. Также можно добавиÑÑ Ð·Ð²ÑздоÑÐºÑ (*) пеÑед индекÑиÑÑемÑми Ñловами, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¸ не пÑовеÑÑлиÑÑ Ð¿Ð¾ внÑÑÑÐµÐ½Ð½ÐµÐ¼Ñ ÑловаÑÑ, но вÑе Ñлова-обÑазÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¸Ð·Ð²ÐµÑÑÐ½Ñ Ð²Ð½ÑÑÑÐµÐ½Ð½ÐµÐ¼Ñ ÑловаÑÑ.
ÐÑли Ð²Ñ Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑÑагменÑÑ ÑооÑвеÑÑÑвÑÑÑ Ð½ÐµÑколÑко ÑÑаз в ÑÑом ÑпиÑке, ÑезаÑÑÑÑ Ð²ÑбеÑÐµÑ Ñамое длинное опÑеделение, а еÑли ÑÐ°ÐºÐ¸Ñ Ð¾ÐºÐ°Ð¶ÐµÑÑÑ Ð½ÐµÑколÑко, Ñамое поÑледнее из Ð½Ð¸Ñ .
ÐÑделиÑÑ Ð²Ð¾ ÑÑазе какие-Ñо ÑÑоп-Ñлова нелÑзÑ; вмеÑÑо ÑÑого можно вÑÑавиÑÑ ? в Ñом меÑÑе, где Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ ÑÑоп-Ñлово. ÐапÑимеÑ, в пÑедположении, ÑÑо a и the â ÑÑоп-Ñлова по внÑÑÑÐµÐ½Ð½ÐµÐ¼Ñ ÑловаÑÑ:
? one ? two : swsw
ÑооÑвеÑÑÑвÑÐµÑ Ð²Ñ
однÑм ÑÑÑокам a one the two и the one a two, Ñак ÑÑо обе ÑÑи ÑÑÑоки бÑдÑÑ Ð·Ð°Ð¼ÐµÐ½ÐµÐ½Ñ Ð½Ð° swsw.
Ðак и обÑÑнÑй ÑловаÑÑ, ÑезаÑÑÑÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ пÑивÑзÑваÑÑÑÑ Ðº лекÑемам опÑеделÑннÑÑ
Ñипов. Так как ÑезаÑÑÑÑ Ð¼Ð¾Ð¶ÐµÑ ÑаÑпознаваÑÑ ÑÑазÑ, он должен запоминаÑÑ ÑÐ²Ð¾Ñ ÑоÑÑоÑние и взаимодейÑÑвоваÑÑ Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°ÑоÑом. УÑиÑÑÐ²Ð°Ñ Ñвои пÑивÑзки, он Ð¼Ð¾Ð¶ÐµÑ Ð»Ð¸Ð±Ð¾ обÑабаÑÑваÑÑ ÑледÑÑÑий ÑÑагменÑ, либо пÑекÑаÑиÑÑ Ð½Ð°ÐºÐ¾Ð¿Ð»ÐµÐ½Ð¸Ðµ ÑÑазÑ. ÐоÑÑÐ¾Ð¼Ñ Ð½Ð°ÑÑÑойка ÑезаÑÑÑÑов в ÑиÑÑеме ÑÑебÑÐµÑ Ð¾Ñобого вниманиÑ. ÐапÑимеÑ, еÑли пÑивÑзаÑÑ ÑезаÑÑÑÑ ÑолÑко к ÑÐ¸Ð¿Ñ ÑÑагменÑов asciiword, Ñогда опÑеделение в ÑезаÑÑÑÑе one 7 не бÑÐ´ÐµÑ ÑабоÑаÑÑ, Ñак как ÑÑÐ¾Ñ ÑезаÑÑÑÑ Ð½Ðµ ÑвÑзан Ñ Ñипом uint.
Ðнимание
ТезаÑÑÑÑÑ Ð¸ÑполÑзÑÑÑÑÑ Ð¿Ñи индекÑаÑии, поÑÑÐ¾Ð¼Ñ Ð¿Ñи лÑбом изменении паÑамеÑÑов или ÑодеÑжимого ÑезаÑÑÑÑа Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð° пеÑеиндекÑаÑиÑ. ÐÐ»Ñ Ð±Ð¾Ð»ÑÑинÑÑва дÑÑÐ³Ð¸Ñ Ñипов ÑловаÑей пÑи неболÑÑÐ¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸ÑÑ , ÑÐ°ÐºÐ¸Ñ ÐºÐ°Ðº Ñдаление и добавление ÑÑоп-Ñлов, пеÑеиндекÑаÑÐ¸Ñ Ð½Ðµ ÑÑебÑеÑÑÑ.
12.6.4.1. ÐонÑигÑÑаÑÐ¸Ñ ÑезаÑÑÑÑа
ÐÐ»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑловаÑÑ-ÑезаÑÑÑÑа иÑполÑзÑеÑÑÑ Ñаблон thesaurus. ÐапÑимеÑ:
CREATE TEXT SEARCH DICTIONARY thesaurus_simple (
TEMPLATE = thesaurus,
DictFile = mythesaurus,
Dictionary = pg_catalog.english_stem
);ÐдеÑÑ:
thesaurus_simpleâ Ð¸Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑловаÑÑmythesaurusâ базовое Ð¸Ð¼Ñ Ñайла конÑигÑÑаÑии ÑезаÑÑÑÑа. (ÐолнÑм пÑÑÑм к ÑÐ°Ð¹Ð»Ñ Ð±ÑдеÑ$SHAREDIR/tsearch_data/mythesaurus.ths, где$SHAREDIRÑказÑÐ²Ð°ÐµÑ Ð½Ð° каÑалог обÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ PostgreSQL.)pg_catalog.english_stemâ внÑÑÑенний ÑловаÑÑ (в данном ÑлÑÑае ÑÑо ÑÑÐµÐ¼Ð¼ÐµÑ Snowball Ð´Ð»Ñ Ð°Ð½Ð³Ð»Ð¸Ð¹Ñкого) Ð´Ð»Ñ Ð½Ð¾ÑмализаÑии ÑезаÑÑÑÑа. ÐамеÑÑÑе, ÑÑо внÑÑÑенний ÑловаÑÑ Ð¸Ð¼ÐµÐµÑ ÑобÑÑвеннÑÑ ÐºÐ¾Ð½ÑигÑÑаÑÐ¸Ñ (напÑимеÑ, ÑпиÑок ÑÑоп-Ñлов), но здеÑÑ Ð¾Ð½Ð° не ÑаÑÑмаÑÑиваеÑÑÑ.
ТепеÑÑ ÑезаÑÑÑÑ thesaurus_simple можно ÑвÑзаÑÑ Ñ Ð¶ÐµÐ»Ð°ÐµÐ¼Ñми Ñипами ÑÑагменÑов в конÑигÑÑаÑии, напÑÐ¸Ð¼ÐµÑ Ñак:
ALTER TEXT SEARCH CONFIGURATION english
ALTER MAPPING FOR asciiword, asciihword, hword_asciipart
WITH thesaurus_simple;12.6.4.2. ÐÑÐ¸Ð¼ÐµÑ ÑезаÑÑÑÑа
ÐавайÑе ÑаÑÑмоÑÑим пÑоÑÑой аÑÑÑономиÑеÑкий ÑезаÑÑÑÑ thesaurus_astro, ÑодеÑжаÑий неÑколÑко аÑÑÑономиÑеÑкиÑ
ÑеÑминов:
supernovae stars : sn crab nebulae : crab
Ðиже Ð¼Ñ Ñоздадим ÑловаÑÑ Ð¸ пÑивÑжем некоÑоÑÑе ÑÐ¸Ð¿Ñ ÑÑагменÑов к аÑÑÑономиÑеÑÐºÐ¾Ð¼Ñ ÑезаÑÑÑÑÑ Ð¸ английÑÐºÐ¾Ð¼Ñ ÑÑеммеÑÑ:
CREATE TEXT SEARCH DICTIONARY thesaurus_astro (
TEMPLATE = thesaurus,
DictFile = thesaurus_astro,
Dictionary = english_stem
);
ALTER TEXT SEARCH CONFIGURATION russian
ALTER MAPPING FOR asciiword, asciihword, hword_asciipart
WITH thesaurus_astro, english_stem; ТепеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ пÑовеÑиÑÑ, как он ÑабоÑаеÑ. ФÑнкÑÐ¸Ñ ts_lexize не оÑÐµÐ½Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð° Ð´Ð»Ñ Ð¿ÑовеÑки ÑезаÑÑÑÑа, Ñак как она обÑабаÑÑÐ²Ð°ÐµÑ Ð²Ñ
однÑÑ ÑÑÑÐ¾ÐºÑ ÐºÐ°Ðº один ÑÑагменÑ. ÐмеÑÑо Ð½ÐµÑ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ ÑÑнкÑии plainto_tsquery и to_tsvector, коÑоÑÑе ÑазбиваÑÑ Ð²Ñ
однÑÑ ÑÑÑÐ¾ÐºÑ Ð½Ð° неÑколÑко ÑÑагменÑов:
SELECT plainto_tsquery('supernova star');
plainto_tsquery
-----------------
'sn'
SELECT to_tsvector('supernova star');
to_tsvector
-------------
'sn':1
РпÑинÑипе Ñак же можно иÑполÑзоваÑÑ to_tsquery, еÑли заклÑÑиÑÑ Ð°ÑгÑÐ¼ÐµÐ½Ñ Ð² кавÑÑки:
SELECT to_tsquery(' ''supernova star''');
to_tsquery
------------
'sn'
ÐамеÑÑÑе, ÑÑо supernova star ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ supernovae stars в thesaurus_astro, Ñак как Ð¼Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑили ÑÑÐµÐ¼Ð¼ÐµÑ english_stem в опÑеделении ÑезаÑÑÑÑа. ÐÑÐ¾Ñ ÑÑÐµÐ¼Ð¼ÐµÑ Ñдалил конеÑнÑе бÑÐºÐ²Ñ e и s.
ЧÑÐ¾Ð±Ñ Ð¿ÑоиндекÑиÑоваÑÑ Ð¸ÑÑ Ð¾Ð´Ð½ÑÑ ÑÑÐ°Ð·Ñ Ð²Ð¼ÐµÑÑе Ñ Ð·Ð°Ð¼ÐµÐ½Ð¾Ð¹, ÐµÑ Ð½Ñжно пÑоÑÑо добавиÑÑ Ð² пÑавÑÑ ÑаÑÑÑ ÑооÑвеÑÑÑвÑÑÑего опÑеделениÑ:
supernovae stars : sn supernovae stars
SELECT plainto_tsquery('supernova star');
plainto_tsquery
-----------------------------
'sn' & 'supernova' & 'star'
12.6.5. СловаÑÑ Ispell
Шаблон ÑловаÑей Ispell поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¼Ð¾ÑÑологиÑеÑкие ÑловаÑи, коÑоÑÑе могÑÑ ÑводиÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво ÑазнÑÑ
лингвиÑÑиÑеÑкиÑ
ÑоÑм Ñлова к одной лекÑеме. ÐапÑимеÑ, английÑкий ÑловаÑÑ Ispell Ð¼Ð¾Ð¶ÐµÑ ÑвÑзаÑÑ Ð²Ð¼ÐµÑÑе вÑе ÑÐºÐ»Ð¾Ð½ÐµÐ½Ð¸Ñ Ð¸ ÑпÑÑÐ¶ÐµÐ½Ð¸Ñ ÐºÐ»ÑÑевого Ñлова bank: banking, banked, banks, banks',bank's и Ñ. п.
СÑандаÑÑнÑй диÑÑÑибÑÑив Postgres Pro не вклÑÑÐ°ÐµÑ ÑÐ°Ð¹Ð»Ñ ÐºÐ¾Ð½ÑигÑÑаÑии Ispell. ÐагÑÑзиÑÑ ÑловаÑи Ð´Ð»Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑва ÑзÑков можно Ñо ÑÑÑаниÑÑ Ispell. ÐÑоме Ñого, поддеÑживаÑÑÑÑ Ð¸ дÑÑгие ÑовÑеменнÑе ÑоÑмаÑÑ ÑловаÑей: MySpell (OO < 2.0.1) и Hunspell (OO >= 2.0.2). ÐолÑÑой Ð½Ð°Ð±Ð¾Ñ ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ ÑловаÑей можно найÑи на ÑÑÑаниÑе OpenOffice Wiki.
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ ÑловаÑÑ Ispell, вÑполниÑе ÑледÑÑÑие дейÑÑвиÑ:
загÑÑзиÑе ÑÐ°Ð¹Ð»Ñ ÐºÐ¾Ð½ÑигÑÑаÑии ÑловаÑÑ. ÐÐ°ÐºÐµÑ Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑм ÑловаÑÑм OpenOffice Ð¸Ð¼ÐµÐµÑ ÑаÑÑиÑение
.oxt. Ðз него Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ извлеÑÑ ÑайлÑ.affи.dic, и ÑмениÑÑ Ð¸Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð½Ð°.affixи.dict, ÑооÑвеÑÑÑвенно. ÐÐ»Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ Ñайлов ÑловаÑей Ñакже Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ пÑеобÑазоваÑÑ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð² кодиÑÐ¾Ð²ÐºÑ UTF-8 Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ, напÑимеÑ, ÑÐ°ÐºÐ¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ (Ð´Ð»Ñ Ð½Ð¾ÑвежÑкого ÑзÑка):iconv -f ISO_8859-1 -t UTF-8 -o nn_no.affix nn_NO.aff iconv -f ISO_8859-1 -t UTF-8 -o nn_no.dict nn_NO.dic
ÑкопиÑÑйÑе ÑÐ°Ð¹Ð»Ñ Ð² каÑалог
$SHAREDIR/tsearch_dataзагÑÑзиÑе ÑÑи ÑÐ°Ð¹Ð»Ñ Ð² Postgres Pro ÑледÑÑÑей командой:
CREATE TEXT SEARCH DICTIONARY english_hunspell ( TEMPLATE = ispell, DictFile = en_us, AffFile = en_us, Stopwords = english);
ÐдеÑÑ Ð¿Ð°ÑамеÑÑÑ DictFile, AffFile и StopWords опÑеделÑÑÑ Ð±Ð°Ð·Ð¾Ð²Ñе имена Ñайлов ÑловаÑÑ, аÑÑикÑов и ÑÑоп-Ñлов. Файл ÑÑоп-Ñлов должен имеÑÑ ÑÐ¾Ñ Ð¶Ðµ ÑоÑмаÑ, ÑÑо ÑаÑÑмаÑÑивалÑÑ Ð²ÑÑе в опиÑании ÑловаÑÑ simple. ФоÑÐ¼Ð°Ñ Ð´ÑÑгиÑ
Ñайлов здеÑÑ Ð½Ðµ ÑаÑÑмаÑÑиваеÑÑÑ, но его можно ÑзнаÑÑ Ð¿Ð¾ вÑÑеÑказаннÑм веб-адÑеÑам.
СловаÑи Ispell обÑÑно воÑпÑинимаÑÑ Ð¾Ð³ÑаниÑеннÑй Ð½Ð°Ð±Ð¾Ñ Ñлов, Ñак ÑÑо за ними ÑледÑÐµÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑиÑÑ Ð´ÑÑгой, более обÑий ÑловаÑÑ, напÑимеÑ, Snowball, коÑоÑÑй пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð²ÑÑ.
Файл .affix Ð´Ð»Ñ Ispell Ð¸Ð¼ÐµÐµÑ ÑакÑÑ ÑÑÑÑкÑÑÑÑ:
prefixes
flag *A:
. > RE # As in enter > reenter
suffixes
flag T:
E > ST # As in late > latest
[^AEIOU]Y > -Y,IEST # As in dirty > dirtiest
[AEIOU]Y > EST # As in gray > grayest
[^EY] > EST # As in small > smallestÐ Ñайл .dict â ÑакÑÑ:
lapse/ADGRS lard/DGRS large/PRTY lark/MRS
ФоÑÐ¼Ð°Ñ Ñайла .dict ÑледÑÑÑий:
basic_form/affix_class_name
Ð Ñайле .affix каждÑй Ñлаг аÑÑикÑов опиÑÑваеÑÑÑ Ð² ÑледÑÑÑем ÑоÑмаÑе:
ÑÑловие > [-оÑÑекаемÑе_бÑквÑ,] добавлÑемÑй_аÑÑикÑ
ÐдеÑÑ ÑÑловие запиÑÑваеÑÑÑ Ð² ÑоÑмаÑе, подобном ÑоÑмаÑÑ ÑегÑлÑÑнÑÑ
вÑÑажений. РнÑм возможно опиÑаÑÑ Ð³ÑÑÐ¿Ð¿Ñ [...] и [^...]. ÐапÑимеÑ, запиÑÑ [AEIOU]Y ознаÑаеÑ, ÑÑо поÑледнÑÑ Ð±Ñква Ñлова â "y", а пÑедпоÑледней Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ "a", "e", "i", "o" или "u". ÐапиÑÑ [^EY] ознаÑаеÑ, ÑÑо поÑледнÑÑ Ð±Ñква не "e" и не "y".
СловаÑи Ispell поддеÑживаÑÑ Ñазделение ÑоÑÑавнÑÑ
Ñлов, ÑÑо бÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾. ÐамеÑÑÑе, ÑÑо Ð´Ð»Ñ ÑÑого в Ñайле аÑÑикÑов нÑжно помеÑиÑÑ ÑпеÑиалÑнÑм опеÑаÑоÑом compoundwords controlled Ñлова, коÑоÑÑе могÑÑ ÑÑаÑÑвоваÑÑ Ð² ÑоÑÑавнÑÑ
обÑазованиÑÑ
:
compoundwords controlled z
ÐÐ¾Ñ ÐºÐ°Ðº ÑÑо ÑабоÑÐ°ÐµÑ Ð´Ð»Ñ Ð½Ð¾ÑвежÑкого ÑзÑка:
SELECT ts_lexize('norwegian_ispell', 'overbuljongterningpakkmesterassistent');
{over,buljong,terning,pakk,mester,assistent}
SELECT ts_lexize('norwegian_ispell', 'sjokoladefabrikk');
{sjokoladefabrikk,sjokolade,fabrikk}ФоÑÐ¼Ð°Ñ MySpell пÑедÑÑавлÑÐµÑ Ñобой подмножеÑÑво ÑоÑмаÑа Hunspell. Файл .affix ÑловаÑÑ Hunspell Ð¸Ð¼ÐµÐµÑ ÑледÑÑÑÑÑ ÑÑÑÑкÑÑÑÑ:
PFX A Y 1 PFX A 0 re . SFX T N 4 SFX T 0 st e SFX T y iest [^aeiou]y SFX T 0 est [aeiou]y SFX T 0 est [^ey]
ÐеÑÐ²Ð°Ñ ÑÑÑока клаÑÑа аÑÑикÑов â заголовок. ÐÐ¾Ð»Ñ Ð¿Ñавил аÑÑикÑов ÑказÑваÑÑÑÑ Ð¿Ð¾Ñле заголовка:
Ð¸Ð¼Ñ Ð¿Ð°ÑамеÑÑа (PFX или SFX)
Ñлаг (Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа аÑÑикÑов)
оÑÑекаемÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð² наÑале (в пÑеÑикÑе) или в конÑе (в ÑÑÑÑикÑе) Ñлова
добавлÑемÑй аÑÑикÑ
ÑÑловие в ÑоÑмаÑе, подобном ÑегÑлÑÑнÑм вÑÑажениÑм.
Файл .dict подобен ÑÐ°Ð¹Ð»Ñ .dict ÑловаÑÑ Ispell:
larder/M lardy/RT large/RSPMYT largehearted
ÐÑимеÑание
СловаÑÑ MySpell не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑоÑÑавнÑе Ñлова. С дÑÑгой ÑÑоÑонÑ, Hunspell поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво опеÑаÑии Ñ Ð½Ð¸Ð¼Ð¸, но в наÑÑоÑÑее вÑÐµÐ¼Ñ Postgres Pro иÑполÑзÑÐµÑ ÑолÑко ÑамÑе пÑоÑÑÑе из ÑÑого множеÑÑва.
12.6.6. СловаÑÑ Snowball
Шаблон ÑловаÑей Snowball оÑнован на пÑоекÑе ÐаÑÑина ÐоÑеÑа, изобÑеÑаÑÐµÐ»Ñ Ð¿Ð¾Ð¿ÑлÑÑного алгоÑиÑма ÑÑемминга Ð´Ð»Ñ Ð°Ð½Ð³Ð»Ð¸Ð¹Ñкого ÑзÑка. СейÑÐ°Ñ Snowball пÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ Ð°Ð»Ð³Ð¾ÑиÑÐ¼Ñ Ð¸ Ð´Ð»Ñ Ð¼Ð½Ð¾Ð³Ð¸Ñ
дÑÑгиÑ
ÑзÑков (за подÑобноÑÑÑми обÑаÑиÑеÑÑ Ð½Ð° ÑÐ°Ð¹Ñ Snowball). ÐаждÑй алгоÑиÑм знаеÑ, как Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ ÑзÑка ÑвеÑÑи ÑаÑпÑоÑÑÑанÑннÑе ÑловоÑоÑÐ¼Ñ Ðº наÑалÑной ÑоÑме. ÐÐ»Ñ ÑловаÑÑ Snowball задаÑÑÑÑ Ð¾Ð±ÑзаÑелÑнÑй паÑамеÑÑ language, опÑеделÑÑÑий, какой именно ÑÑÐµÐ¼Ð¼ÐµÑ Ð¸ÑполÑзоваÑÑ, и Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ Ð¿Ð°ÑамеÑÑ stopword, ÑказÑваÑÑий Ñайл Ñо ÑпиÑком иÑклÑÑаемÑÑ
Ñлов. (СÑандаÑÑнÑе ÑпиÑки ÑÑоп-Ñлов Postgres Pro иÑполÑзÑеÑÑÑ Ñакже в и пÑоекÑе Snowball.) ÐапÑимеÑ, вÑÑÑоенное опÑеделение вÑглÑÐ´Ð¸Ñ Ñак
CREATE TEXT SEARCH DICTIONARY english_stem (
TEMPLATE = snowball,
Language = english,
StopWords = english
);ФоÑÐ¼Ð°Ñ Ñайла ÑÑоп-Ñлов не оÑлиÑаеÑÑÑ Ð¾Ñ ÑаÑÑмоÑÑенного Ñанее.
СловаÑÑ Snowball ÑаÑпознаÑÑ Ð»ÑбÑе ÑÑагменÑÑ, даже еÑли он не Ð¼Ð¾Ð¶ÐµÑ ÑпÑоÑÑиÑÑ Ñлова, Ñак ÑÑо он должен бÑÑÑ ÑамÑм поÑледним в ÑпиÑке ÑловаÑей. ÐомеÑаÑÑ ÐµÐ³Ð¾ пеÑед дÑÑгими ÑловаÑÑми Ð½ÐµÑ ÑмÑÑла, Ñак как поÑле него никакой ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ Ð½Ðµ бÑÐ´ÐµÑ Ð¿ÐµÑедан ÑледÑÑÑÐµÐ¼Ñ ÑловаÑÑ.