F.63. unaccent
ÐодÑÐ»Ñ unaccent пÑедÑÑавлÑÐµÑ ÑловаÑÑ ÑекÑÑового поиÑка, коÑоÑÑй ÑбиÑÐ°ÐµÑ Ð½Ð°Ð´ÑÑÑоÑнÑе (диакÑиÑиÑеÑкие) знаки из лекÑем. ÐÑо ÑилÑÑÑÑÑÑий ÑловаÑÑ, ÑÑо знаÑиÑ, ÑÑо вÑводимÑе им даннÑе вÑегда пеÑедаÑÑÑÑ ÑледÑÑÑÐµÐ¼Ñ ÑловаÑÑ (еÑли он еÑÑÑ), в оÑлиÑие Ð¾Ñ Ð½Ð¾ÑмалÑнÑÑ
ÑловаÑей. ÐÑименÑÑ ÐµÐ³Ð¾, можно вÑполниÑÑ Ð¿Ð¾Ð»Ð½Ð¾ÑекÑÑовÑй поиÑк без ÑÑÑÑа ÑдаÑений (диакÑиÑики).
ТекÑÑÑÑ ÑеализаÑÐ¸Ñ unaccent нелÑÐ·Ñ Ð¸ÑполÑзоваÑÑ Ð² каÑеÑÑве ноÑмализÑÑÑего ÑловаÑÑ Ð´Ð»Ñ ÑловаÑÑ thesaurus.
ÐаннÑй модÑÐ»Ñ ÑÑиÑаеÑÑÑ Â«Ð´Ð¾Ð²ÐµÑеннÑм», Ñо еÑÑÑ ÐµÐ³Ð¾ могÑÑ ÑÑÑанавливаÑÑ Ð¾Ð±ÑÑнÑе полÑзоваÑели, имеÑÑие пÑаво CREATE в ÑекÑÑей базе даннÑÑ
.
F.63.1. ÐонÑигÑÑиÑование
СловаÑÑ unaccent пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑледÑÑÑие паÑамеÑÑÑ:
ÐаÑамеÑÑ
RULESзадаÑÑ Ð±Ð°Ð·Ð¾Ð²Ð¾Ðµ Ð¸Ð¼Ñ Ñайла Ñо ÑпиÑком пÑавил пÑеобÑазованиÑ. ÐÑÐ¾Ñ Ñайл должен Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑÑ Ð² каÑалоге$SHAREDIR/tsearch_data/(где под$SHAREDIRпонимаеÑÑÑ ÐºÐ°Ñалог Ñ Ð¾Ð±Ñими даннÑми инÑÑаллÑÑии Postgres Pro). ÐÐ¼Ñ Ñайла должно заканÑиваÑÑÑÑ ÑаÑÑиÑением.rules(коÑоÑое не нÑжно ÑказÑваÑÑ Ð² паÑамеÑÑеRULES).
Файл пÑавил Ð¸Ð¼ÐµÐµÑ ÑледÑÑÑий ÑоÑмаÑ:
ÐÐ°Ð¶Ð´Ð°Ñ ÑÑÑока пÑедÑÑавлÑÐµÑ Ð¾Ð´Ð½Ð¾ пÑавило пеÑевода, ÑоÑÑоÑÑее из Ñимвола Ñ Ð´Ð¸Ð°ÐºÑиÑикой, за коÑоÑÑм ÑледÑÐµÑ Ñимвол без диакÑиÑики. ÐеÑвÑй Ñимвол пеÑеводиÑÑÑ Ð²Ð¾ вÑоÑой. ÐапÑимеÑ,
à A à A à A à A à A à A à AE
ÐÑи два Ñимвола Ð´Ð¾Ð»Ð¶Ð½Ñ ÑазделÑÑÑÑÑ Ð¿ÑобелÑнÑм Ñимволом, а лÑбÑе наÑалÑнÑе или конеÑнÑе пÑобелÑнÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð² ÑÑой ÑÑÑоке игноÑиÑÑÑÑÑÑ.
РкаÑеÑÑве алÑÑеÑнаÑивного ваÑианÑа, еÑли в ÑÑÑоке задан вÑего один Ñимвол, Ð²Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ ÑÑого Ñимвола бÑдÑÑ ÑдалÑÑÑÑÑ; ÑÑо полезно Ð´Ð»Ñ ÑзÑков, в коÑоÑÑÑ Ð´Ð¸Ð°ÐºÑиÑика пÑедÑÑавлÑеÑÑÑ Ð¾ÑделÑнÑми Ñимволами.
Ðа Ñамом деле ÑÐ¾Ð»Ñ Â«Ñимвола» Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð³ÑаÑÑ Ð»ÑÐ±Ð°Ñ ÑÑÑока, не ÑодеÑжаÑÐ°Ñ Ð¿ÑобелÑнÑе ÑимволÑ, Ñак ÑÑо ÑловаÑи
unaccentмогÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ Ð¸ Ð´Ð»Ñ Ð´ÑÑгого Ñода Ð·Ð°Ð¼ÐµÐ½Ñ Ð¿Ð¾Ð´ÑÑÑок, а не ÑолÑко Ð´Ð»Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð´Ð¸Ð°ÐºÑиÑик.Ðак и дÑÑгие ÑÐ°Ð¹Ð»Ñ ÐºÐ¾Ð½ÑигÑÑаÑии ÑекÑÑового поиÑка в Postgres Pro, Ñайл пÑавил должен имеÑÑ ÐºÐ¾Ð´Ð¸ÑÐ¾Ð²ÐºÑ UTF-8. ÐÑи загÑÑзке даннÑе из него бÑдÑÑ Ð°Ð²ÑомаÑиÑеÑки пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ñ Ð² кодиÑÐ¾Ð²ÐºÑ ÑекÑÑей Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐÑе ÑÑÑоки в нÑм, ÑодеÑжаÑие непеÑеводимÑе ÑимволÑ, пÑоÑÑо игноÑиÑÑÑÑÑÑ, Ñак ÑÑо ÑÐ°Ð¹Ð»Ñ Ð¿Ñавил могÑÑ ÑодеÑжаÑÑ Ð¿Ñавила, непÑименимÑе в ÑекÑÑей кодиÑовке.
Ðолее полнÑй Ð½Ð°Ð±Ð¾Ñ Ð¿Ñавил, непоÑÑедÑÑвенно пÑигоднÑй Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑинÑÑва евÑопейÑкиÑ
ÑзÑков, можно найÑи в Ñайле unaccent.rules, коÑоÑÑй помеÑаеÑÑÑ Ð² $SHAREDIR/tsearch_data/, когда ÑÑÑанавливаеÑÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ unaccent. ÐÑÐ¾Ñ Ñайл пÑавил пеÑÐµÐ²Ð¾Ð´Ð¸Ñ Ð±ÑÐºÐ²Ñ Ñ Ð´Ð¸Ð°ÐºÑиÑикой в Ñе же бÑÐºÐ²Ñ Ð±ÐµÐ· диакÑиÑики, а Ñакже ÑазвоÑаÑÐ¸Ð²Ð°ÐµÑ Ð»Ð¸Ð³Ð°ÑÑÑÑ Ð² ÑавнознаÑнÑе поÑледоваÑелÑноÑÑи пÑоÑÑÑÑ
Ñимволов (напÑимеÑ, à в AE).
F.63.2. ÐÑполÑзование
ÐÑи ÑÑÑановке ÑаÑÑиÑÐµÐ½Ð¸Ñ unaccent в базе ÑоздаÑÑÑÑ Ñаблон ÑекÑÑового поиÑка unaccent и ÑловаÑÑ unaccent на его оÑнове. ÐÐ»Ñ ÑловаÑÑ unaccent по ÑмолÑÐ°Ð½Ð¸Ñ Ð¾Ð¿ÑеделÑеÑÑÑ Ð¿Ð°ÑамеÑÑ RULES='unaccent', благодаÑÑ ÑÐµÐ¼Ñ ÐµÐ³Ð¾ можно ÑÑÐ°Ð·Ñ Ð¸ÑполÑзоваÑÑ Ñо ÑÑандаÑÑнÑм Ñайлом unaccent.rules. ÐÑи желании Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе измениÑÑ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ, напÑимеÑ, Ñак
mydb=# ALTER TEXT SEARCH DICTIONARY unaccent (RULES='my_rules');
или ÑоздаÑÑ Ð½Ð¾Ð²Ñе ÑловаÑи на оÑнове ÑÑого Ñаблона.
ÐÑоÑеÑÑиÑоваÑÑ ÑÑÐ¾Ñ ÑловаÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ Ñак:
mydb=# select ts_lexize('unaccent','Hôtel');
ts_lexize
-----------
{Hotel}
(1 row)СледÑÑÑий пÑÐ¸Ð¼ÐµÑ Ð¿Ð¾ÐºÐ°Ð·ÑваеÑ, как вÑÑавиÑÑ ÑловаÑÑ unaccent в конÑигÑÑаÑÐ¸Ñ ÑекÑÑового поиÑка:
mydb=# CREATE TEXT SEARCH CONFIGURATION fr ( COPY = french );
mydb=# ALTER TEXT SEARCH CONFIGURATION fr
ALTER MAPPING FOR hword, hword_part, word
WITH unaccent, french_stem;
mydb=# select to_tsvector('fr','Hôtels de la Mer');
to_tsvector
-------------------
'hotel':1 'mer':4
(1 row)
mydb=# select to_tsvector('fr','Hôtel de la Mer') @@ to_tsquery('fr','Hotels');
?column?
----------
t
(1 row)
mydb=# select ts_headline('fr','Hôtel de la Mer',to_tsquery('fr','Hotels'));
ts_headline
------------------------
<b>Hôtel</b> de la Mer
(1 row)F.63.3. ФÑнкÑии
ФÑнкÑÐ¸Ñ unaccent() ÑдалÑÐµÑ Ð½Ð°Ð´ÑÑÑоÑнÑе (диакÑиÑиÑеÑкие) знаки из заданной ÑÑÑоки. Ðо ÑÑÑи она пÑедÑÑавлÑÐµÑ Ñобой обÑÑÑÐºÑ Ð²Ð¾ÐºÑÑг ÑловаÑей в ÑÑиле unaccent, но Ð¼Ð¾Ð¶ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð¸ вне обÑÑного конÑекÑÑа ÑекÑÑового поиÑка.
unaccent([ÑловаÑÑregdictionary,]ÑÑÑокаtext) returnstext
ÐÑли аÑгÑÐ¼ÐµÐ½Ñ ÑловаÑÑ Ð¾Ð¿ÑÑен, бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ ÑловаÑÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ unaccent, наÑ
одÑÑийÑÑ Ð² Ñой же ÑÑ
еме, ÑÑо и Ñама ÑÑнкÑÐ¸Ñ unaccent().
ÐÑимеÑ:
SELECT unaccent('unaccent', 'Hôtel');
SELECT unaccent('Hôtel');