F.48. rum
F.48.1. Ðведение
ÐодÑÐ»Ñ rum пÑедоÑÑавлÑÐµÑ Ð¼ÐµÑод доÑÑÑпа RUM Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¸Ð½Ð´ÐµÐºÑами. Ðн оÑнован на коде меÑодов доÑÑÑпа GIN.
ÐÐ½Ð´ÐµÐºÑ GIN позволÑÐµÑ Ð²ÑполнÑÑÑ Ð±ÑÑÑÑÑй полноÑекÑÑовÑй поиÑк, иÑполÑзÑÑ ÑÐ¸Ð¿Ñ tsvector и tsquery. Ðднако пÑи ÑÑом пÑименении он Ð¸Ð¼ÐµÐµÑ ÑледÑÑÑие недоÑÑаÑки:
Ðедленное ÑанжиÑование. ÐÐ»Ñ ÑанжиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð° инÑоÑмаÑÐ¸Ñ Ð¾ позиÑиÑÑ Ð»ÐµÐºÑем, но в индекÑе
GINÑÑа инÑоÑмаÑÐ¸Ñ Ð½Ðµ ÑÐ¾Ñ ÑанÑеÑÑÑ. ÐоÑÑÐ¾Ð¼Ñ Ð¿Ð¾Ñле ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ пÑовеÑÑи еÑÑ Ð¾Ð´Ð½Ð¾ ÑканиÑование ÑобÑÑвенно даннÑÑ , ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¿Ð¾Ð·Ð¸Ñии лекÑем.ÐедленнÑй поиÑк ÑÑаз. ÐÑа пÑоблема ÑвÑзана Ñ Ð¿ÑедÑдÑÑей, Ñак как и Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка ÑÑаз Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð° инÑоÑмаÑÐ¸Ñ Ð¾ позиÑиÑÑ .
Ðедленное ÑпоÑÑдоÑивание по меÑкам вÑемени. ÐндекÑ
GINне Ð¼Ð¾Ð¶ÐµÑ ÑÐ¾Ñ ÑанÑÑÑ Ð²Ð¼ÐµÑÑе Ñ Ð»ÐµÐºÑемами никакÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð¸Ð½ÑоÑмаÑиÑ, поÑÑÐ¾Ð¼Ñ ÑÑо ÑÑебÑÐµÑ ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÐºÑÑи.
RUM ÑеÑÐ°ÐµÑ ÑÑи пÑоблемÑ, ÑоÑ
ÑанÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð² деÑеве иденÑиÑикаÑоÑов. Ð ÑаÑÑноÑÑи, он ÑоÑ
ÑанÑÐµÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ позиÑии лекÑем или меÑки вÑемени.
ÐедоÑÑаÑок RUM ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо он ÑÑÑоиÑÑÑ Ð¸ изменÑеÑÑÑ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½ÐµÐµ, Ñем GIN, поÑÐ¾Ð¼Ñ ÑÑо RUM Ñ
ÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð¼Ð¸Ð¼Ð¾ клÑÑей дополниÑелÑнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¸ иÑполÑзÑÐµÑ ÑниÑиÑиÑованнÑе запиÑи WAL.
F.48.2. УÑÑановка
rum â ÑÑо обÑÑное ÑаÑÑиÑение Postgres Pro Standard без какиÑ
-либо оÑобÑÑ
пÑедваÑиÑелÑнÑÑ
ÑÑебований.
ÐÑоÑедÑÑа ÑÑÑановки вÑглÑÐ´Ð¸Ñ ÑледÑÑÑим обÑазом:
$ psql имÑ_бд -c "CREATE EXTENSION rum"
F.48.3. ÐбÑие опеÑаÑоÑÑ
РеализованнÑе в модÑле rum опеÑаÑоÑÑ Ð¿ÐµÑеÑиÑÐ»ÐµÐ½Ñ Ð² ТаблиÑе F.30:
ТаблиÑа F.30. ÐпеÑаÑоÑÑ rum
| ÐпеÑаÑÐ¾Ñ | ÐозвÑаÑÐ°ÐµÑ | ÐпиÑание |
|---|---|---|
tsvector <=> tsquery | float4 | ÐозвÑаÑÐ°ÐµÑ ÑаÑÑÑоÑние Ð¼ÐµÐ¶Ð´Ñ Ð·Ð½Ð°ÑениÑми tsvector и tsquery. |
timestamp <=> timestamp | float8 | ÐозвÑаÑÐ°ÐµÑ ÑаÑÑÑоÑние Ð¼ÐµÐ¶Ð´Ñ Ð´Ð²ÑÐ¼Ñ Ð·Ð½Ð°ÑениÑми timestamp. |
timestamp <=| timestamp | float8 | ÐозвÑаÑÐ°ÐµÑ ÑаÑÑÑоÑние ÑолÑко Ð´Ð»Ñ Ð²Ð¾Ð·ÑаÑÑаÑÑиÑ
знаÑений timestamp. |
timestamp |=> timestamp | float8 | ÐозвÑаÑÐ°ÐµÑ ÑаÑÑÑоÑние ÑолÑко Ð´Ð»Ñ ÑбÑваÑÑиÑ
знаÑений timestamp. |
F.48.4. ÐлаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов
РаÑÑиÑение rum пÑедоÑÑавлÑÐµÑ ÑледÑÑÑие клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов:
rum_tsvector_opsÐ¡Ð¾Ñ ÑанÑÐµÑ Ð»ÐµÐºÑемÑ
tsvectorÑ Ð¸Ð½ÑоÑмаÑией о позиÑиÑÑ . ÐоддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑпоÑÑдоÑивание Ñ Ð¾Ð¿ÐµÑаÑоÑом<=>и поиÑк по пÑеÑикÑÑ.rum_tsvector_hash_opsÐ¡Ð¾Ñ ÑанÑÐµÑ Ñ ÐµÑ Ð»ÐµÐºÑем
tsvectorÑ Ð¸Ð½ÑоÑмаÑией о позиÑиÑÑ . ÐоддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑпоÑÑдоÑивание Ñ Ð¾Ð¿ÐµÑаÑоÑом<=>, но не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿Ð¾Ð¸Ñк по пÑеÑикÑÑ.rum_tsvector_addon_opsÐ¡Ð¾Ñ ÑанÑÐµÑ Ð»ÐµÐºÑемÑ
tsvectorÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑми даннÑми лÑбÑÑ Ñипов, коÑоÑÑе пÑинимаеÑRUM.rum_tsvector_hash_addon_opsÐ¡Ð¾Ñ ÑанÑÐµÑ Ð»ÐµÐºÑемÑ
tsvectorÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑми даннÑми лÑбÑÑ Ñипов, коÑоÑÑе пÑинимаеÑRUM. Ðе поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿Ð¾Ð¸Ñк по пÑеÑикÑÑ.rum_tsquery_opsÐ¡Ð¾Ñ ÑанÑÐµÑ Ð²ÐµÑви деÑева запÑоÑа в дополниÑелÑной инÑоÑмаÑии.
rum_anyarray_opsÐ¡Ð¾Ñ ÑанÑÐµÑ ÑлеменÑÑ Ð¼Ð°ÑÑива
anyarrayи Ð´Ð»Ð¸Ð½Ñ Ð¼Ð°ÑÑива. ÐоддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑпоÑÑдоÑивание Ñ Ð¾Ð¿ÐµÑаÑоÑом <=>.ÐндекÑиÑÑемÑе опеÑаÑоÑÑ:
&& @> <@ = %rum_anyarray_addon_opsÐ¡Ð¾Ñ ÑанÑÐµÑ ÑлеменÑÑ
anyarrayÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑми даннÑми лÑбÑÑ Ñипов, коÑоÑÑе пÑинимаеÑRUM.rum_Ñип_opsÐ¡Ð¾Ñ ÑанÑÐµÑ Ð»ÐµÐºÑÐµÐ¼Ñ ÑооÑвеÑÑÑвÑÑÑего Ñипа Ñ Ð¸Ð½ÑоÑмаÑией о позиÑиÑÑ . РкаÑеÑÑве
Ñипав имени клаÑÑа должно подÑÑавлÑÑÑÑÑ Ð¾Ð´Ð½Ð¾ из ÑледÑÑÑÐ¸Ñ Ð¸Ð¼Ñн Ñипов:int2,int4,int8,float4,float8,money,oid,timestamp,timestamptz,time,timetz,date,interval,macaddr,inet,cidr,text,varchar,char,bytea,bit,varbit,numeric.ÐлаÑÑ Ð¾Ð¿ÐµÑаÑоÑов
rum_поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑпоÑÑдоÑивание Ñ Ð¾Ð¿ÐµÑаÑоÑамиÑип_ops<=>,<=|и|=>. Ðго можно иÑполÑзоваÑÑ ÑовмеÑÑно Ñ ÐºÐ»Ð°ÑÑами опеÑаÑоÑовrum_tsvector_addon_ops,rum_tsvector_hash_addon_opsиrum_anyarray_addon_ops.ÐоддеÑжка индекÑиÑÑемÑÑ Ð¾Ð¿ÐµÑаÑоÑов завиÑÐ¸Ñ Ð¾Ñ Ñипа даннÑÑ :
ÐпеÑаÑоÑÑ
< <= = >= > <=> <=| |=>поддеÑживаÑÑÑÑ Ð´Ð»Ñ Ñиповint2,int4,int8,float4,float8,money,oid,timestamp,timestamptz.ÐпеÑаÑоÑÑ
< <= = >= >поддеÑживаÑÑÑÑ Ð´Ð»Ñ Ñиповtime,timetz,date,interval,macaddr,inet,cidr,text,varchar,char,bytea,bit,varbit,numeric.
ÐÑимеÑание
СледÑÑÑие клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов ÑепеÑÑ ÑÑиÑаÑÑÑÑ ÑÑÑаÑевÑими: rum_tsvector_timestamp_ops, rum_tsvector_timestamptz_ops, rum_tsvector_hash_timestamp_ops, rum_tsvector_hash_timestamptz_ops.
F.48.5. ÐÑимеÑÑ
F.48.5.1. ÐÑÐ¸Ð¼ÐµÑ Ñ rum_tsvector_ops
ÐÑедположим, ÑÑо Ñ Ð½Ð°Ñ ÐµÑÑÑ ÑаблиÑа:
CREATE TABLE test_rum(t text, a tsvector);
CREATE TRIGGER tsvectorupdate
BEFORE UPDATE OR INSERT ON test_rum
FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger('a', 'pg_catalog.english', 't');
INSERT INTO test_rum(t) VALUES ('The situation is most beautiful');
INSERT INTO test_rum(t) VALUES ('It is a beautiful');
INSERT INTO test_rum(t) VALUES ('It looks like a beautiful place');ÐаÑем Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑоздаÑÑ Ð½Ð¾Ð²Ñй индекÑ:
CREATE INDEX rumidx ON test_rum USING rum (a rum_tsvector_ops);
РвÑполнÑÑÑ ÑледÑÑÑие запÑоÑÑ:
SELECT t, a <=> to_tsquery('english', 'beautiful | place') AS rank
FROM test_rum
WHERE a @@ to_tsquery('english', 'beautiful | place')
ORDER BY a <=> to_tsquery('english', 'beautiful | place');
t | rank
---------------------------------+-----------
The situation is most beautiful | 0.0303964
It is a beautiful | 0.0303964
It looks like a beautiful place | 0.0607927
(3 rows)
SELECT t, a <=> to_tsquery('english', 'place | situation') AS rank
FROM test_rum
WHERE a @@ to_tsquery('english', 'place | situation')
ORDER BY a <=> to_tsquery('english', 'place | situation');
t | rank
---------------------------------+-----------
The situation is most beautiful | 0.0303964
It looks like a beautiful place | 0.0303964
(2 rows)F.48.5.2. ÐÑÐ¸Ð¼ÐµÑ Ñ rum_tsvector_addon_ops
ÐÑедположим, ÑÑо Ñ Ð½Ð°Ñ ÐµÑÑÑ ÑаблиÑа:
CREATE TABLE tsts (id int, t tsvector, d timestamp);
\copy tsts from 'rum/data/tsts.data'
CREATE INDEX tsts_idx ON tsts USING rum (t rum_tsvector_addon_ops, d)
WITH (attach = 'd', to = 't');С ним Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ вÑполнÑÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñе запÑоÑÑ:
EXPLAIN (costs off)
SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts WHERE t @@ 'wr&qh' ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
QUERY PLAN
-----------------------------------------------------------------------------------
Limit
-> Index Scan using tsts_idx on tsts
Index Cond: (t @@ '''wr'' & ''qh'''::tsquery)
Order By: (d <=> 'Mon May 16 14:21:25 2016'::timestamp without time zone)
(4 rows)
SELECT id, d, d <=> '2016-05-16 14:21:25' FROM tsts WHERE t @@ 'wr&qh' ORDER BY d <=> '2016-05-16 14:21:25' LIMIT 5;
id | d | ?column?
-----+---------------------------------+---------------
355 | Mon May 16 14:21:22.326724 2016 | 2.673276
354 | Mon May 16 13:21:22.326724 2016 | 3602.673276
371 | Tue May 17 06:21:22.326724 2016 | 57597.326724
406 | Wed May 18 17:21:22.326724 2016 | 183597.326724
415 | Thu May 19 02:21:22.326724 2016 | 215997.326724
(5 rows)F.48.5.3. ÐÑÐ¸Ð¼ÐµÑ Ñ rum_tsquery_ops
ÐÑедположим, ÑÑо Ñ Ð½Ð°Ñ ÑаблиÑа:
CREATE TABLE query (q tsquery, tag text);
INSERT INTO query VALUES ('supernova & star', 'sn'),
('black', 'color'),
('big & bang & black & hole', 'bang'),
('spiral & galaxy', 'shape'),
('black & hole', 'color');
CREATE INDEX query_idx ON query USING rum(q);ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ вÑполниÑÑ ÑледÑÑÑий бÑÑÑÑÑй запÑоÑ:
SELECT * FROM query
WHERE to_tsvector('black holes never exists before we think about them') @@ q;
q | tag
------------------+-------
'black' | color
'black' & 'hole' | color
(2 rows)F.48.5.4. ÐÑÐ¸Ð¼ÐµÑ Ñ rum_anyarray_ops
ÐÑедположим, ÑÑо Ñ Ð½Ð°Ñ ÐµÑÑÑ ÑаблиÑа:
CREATE TABLE test_array (i int2[]);
INSERT INTO test_array VALUES ('{}'), ('{0}'), ('{1,2,3,4}'), ('{1,2,3}'), ('{1,2}'), ('{1}');
CREATE INDEX idx_array ON test_array USING rum (i rum_anyarray_ops);ТепеÑÑ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ вÑполниÑÑ ÑледÑÑÑий запÑоÑ, иÑполÑзÑÑ ÑканиÑование индекÑа:
SET enable_seqscan TO off;
EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i && '{1}' ORDER BY i <=> '{1}' ASC;
QUERY PLAN
------------------------------------------
Index Scan using idx_array on test_array
Index Cond: (i && '{1}'::smallint[])
Order By: (i <=> '{1}'::smallint[])
(3 rows)
SELECT * FROM test_array WHERE i && '{1}' ORDER BY i <=> '{1}' ASC;
i
-----------
{1}
{1,2}
{1,2,3}
{1,2,3,4}
(4 rows)F.48.6. ÐвÑоÑÑ
ÐлекÑÐ°Ð½Ð´Ñ ÐоÑоÑков
Ðлег ÐаÑÑÑнов
ФÑÐ´Ð¾Ñ Ð¡Ð¸Ð³Ð°ÐµÐ²