RUM拡張機能は、一般的な転置インデックス (GIN) を拡張し、GINアクセスメソッドコードに基づいてより高速な全文検索を実装します。
前提条件
PolarDB for PostgreSQL (Oracle互換) クラスターは、次の要件を満たす必要があります。
PolarDB for PostgreSQL (Oracle互換) 2.0 (バージョン2.0.14.3.0以降)
次のステートメントを実行して、 PolarDB for PostgreSQL (Compatible with Oracle) クラスターのマイナーエンジンバージョンを照会できます。
show polar_version;背景情報
GINは、フルテキスト検索を実装するためにtsvectorおよびtsqueryデータ型をサポートしていますが、次の問題が発生します。
低速ソート: ソートには単語の位置情報が必要です。 しかしながら、GINは、ワード位置を記憶しない。 したがって、インデックススキャン後にワードの位置情報を検索するために追加のスキャンが必要となります。
スローフレーズクエリ: GINは、フレーズ検索を実行するために位置情報を必要とします。
スロータイムスタンプソート: GINは、形態素を含むインデックスに関連情報を格納しません。 したがって、追加のスキャンが必要です。
RUM拡張はGINに基づいており、RUMインデックスに追加情報 (単語位置情報またはタイムスタンプ位置情報) を格納することでこれらの問題を解決できます。
ただし、RUM拡張は、インデックスの構築と挿入にGINよりも時間がかかります。 これは、RUM拡張がWALログに基づいてインデックスを生成し、生成されたRUMインデックスには暗号化に使用されるキーよりも多くの情報が含まれているためです。
一般的なRUM演算子
RUM拡張は、以下の演算子を提供します。
演算子 | データ型 | 説明 |
| float4 |
|
| float8 | 2つのタイムスタンプ値間の距離を計算します。 |
| float8 | 現在のタイムスタンプより小さい値間の距離を計算します。 |
| float8 | 現在のタイムスタンプより大きい値間の距離を計算します。 |
<=> 、<=| 、および |=> 演算子は、次のデータ型にも適用されます。
timestamptzint2int4int8float4float8お金oid
RUM拡張機能の使用
RUM拡張機能の作成
次のSQL文を実行して、RUM拡張をインストールできます。
CREATE EXTENSION rum;クラスターがバージョン要件を満たしているときに拡張機能の作成に失敗した場合は、お問い合わせください。
演算子クラス
rum_tsvect_opsクラスは、位置情報を持つtsvector句を格納し、<=>演算子によるソートとプレフィックス検索をサポートします。例:
データを準備する:
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');RUMインデックスの作成:
CREATE INDEX rumidx ON test_rum USING rum (a rum_tsvector_ops);次のクエリ文を実行します。
クエリ文1:
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 ---------------------------------+---------- It looks like a beautiful place | 8.22467 The situation is most beautiful | 16.44934 It is a beautiful | 16.44934 (3 rows)クエリ文2:
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 | 16.44934 It looks like a beautiful place | 16.44934 (2 rows)
rum_tsvector_hash_opsクラスには、tsvector句のハッシュ値と位置情報が格納されます。 このクラスは、<=>演算子によるソートをサポートしますが、プレフィックス検索はサポートしません。説明rum_tsvector_hash_opsクラスは、<=>、<=|、および|=>演算子によるソートをサポートします。rum_tsvector_addon_ops、rum_tsvector_hash_addon_ops、およびrum_anyarray_addon_opsクラスで使用できます。rum_TYPE_opsクラスは、次のデータ型と演算子をサポートします。データ型:
int2、int4、int8、float4、float8、money、oid、time、timetz、date、interval、macaddr、inet、cidr、text、varchar、char、bytea、bit、varbit、numeric、timestamp、timestamptz。演算子:
<、<=、=、>=、および>演算子は、すべてのデータ型に適用できます。<=>、<=|、および|=>演算子は、int2、int4、int8、float4、float8、money、oid、timestamp、およびtimestamptzデータ型に適用できます。rum_tsvector_addon_opsクラスには、tsvector語彙と、モジュールフィールドでサポートされている語彙が格納されます。例:
データを準備する:
CREATE TABLE tsts (id int, t tsvector, d timestamp); \copy tsts from 'external/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 <=> '2016-05-16 14:21:25'::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 | 2016-05-16 14:21:22.326724 | 2.673276 354 | 2016-05-16 13:21:22.326724 | 3602.673276 371 | 2016-05-17 06:21:22.326724 | 57597.326724 406 | 2016-05-18 17:21:22.326724 | 183597.326724 415 | 2016-05-19 02:21:22.326724 | 215997.326724 (5 rows)説明ポスティングツリーは、固定長の右バウンドおよび固定長の非リーフポスティングアイテムを有するので、RUMは、パスバイリファレンス追加情報上のソートを使用してインデックスを作成する際に欠陥がある可能性があります。
rum_tsvector_hash_addon_opsクラスは、tsvector語彙素と、モジュールフィールドでサポートされている語彙素のハッシュ値を格納します。rum_tsquery_opsクラスは、tsqueryデータ型に適用でき、クエリツリーのブランチを追加情報に格納します。例:
データを準備する:
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)
rum_anyarray_opsクラスは、配列長のanyarrray要素を格納します。 サポートされる演算子には、&&、@>、<@、=、および%が含まれます。<=>演算子によるソートがサポートされています。例:
データを準備する:
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)
rum_anyarray_addon_opsクラスには、anyarrray要素とmoduleフィールドでサポートされる要素が格納されます。
RUM拡張機能のアンインストール
次のSQL文を実行して、RUM拡張をアンインストールできます。
DROP EXTENSION rum;関連ドキュメント
詳細については、「rum」をご参照ください。