これはPGroonga 2.X and 3.X用のドキュメントです。古いPGroongaを使っているならPGroonga 1.xのドキュメントを見てください。
&@
演算子1.2.0で追加。
&@
演算子は1つのキーワードで全文検索を実行します。
使い方は3つあります。
column &@ keyword
column &@ (keyword, weights, index_name)::pgroonga_full_text_search_condition
column &@ (keyword, weights, scorers, index_name)::pgroonga_full_text_search_condition_with_scorers
1つ目の使い方は他の使い方よりもシンプルです。多くの場合は1つ目の使い方で十分です。
2つ目の使い方は検索スコアーを最適化するときに便利です。たとえば、ブログアプリケーションで「タイトルは本文よりも重要」という検索を実現できます。
2つ目の使い方は2.0.4から使えます。
3つ目の使い方は検索スコアーをより最適化するときに便利です。たとえば、キーワードスタッフィング対策を実現することができます。
3つ目の使い方は2.0.6から使えます。
以下は1つ目の使い方の説明です。
column &@ keyword
column
は検索対象のカラムです。型はtext
型、text[]
型、varchar
型のどれかです。
keyword
は全文検索で使うキーワードです。column
がtext
型またはtext[]
型ならkeyword
はtext
型です。column
がvarchar
型ならkeyword
はvarchar
型です。
以下は2つ目の使い方の説明です。
column &@ (keyword, weights, index_name)::pgroonga_full_text_search_condition
column
は検索対象のカラムです。型はtext
型、text[]
型、varchar
型のどれかです。
keyword
は全文検索で使うキーワードです。column
がtext
型またはtext[]
型ならkeyword
はtext
型です。column
がvarchar
型ならkeyword
はvarchar
型です。
weights
は、検索対象のカラムの重要度です。int[]
型です。
もし、column
がtext
型かvarchar
型なら、最初の要素がカラムの値の重要度になります。column
がtext[]
型なら、同じ位置の値がその値の重要度になります。
weights
をNULL
にできます。weights
の要素もNULL
にできます。対応する重要度がNULL
の場合は重要度は1
になります。
重要度が0
の場合は対応する値を無視します。たとえば、ARRAY[1, 0, 1]
は2番目の値は検索しないという意味になります。
index_name
は対応するPGroongaのインデックス名です。text
型です。
index_name
にはNULL
を指定できます。
これはシーケンシャルサーチのときにもPGroongaのインデックスに指定した検索オプションを使えるようにするために使われます。
2.0.6から使えます。
以下は3つ目の使い方の説明です。
column &@ (keyword, weights, scorers, index_name)::pgroonga_full_text_search_condition
column
は検索対象のカラムです。型はtext
型、text[]
型、varchar
型のどれかです。
keyword
は全文検索で使うキーワードです。column
がtext
型またはtext[]
型ならkeyword
はtext
型です。column
がvarchar
型ならkeyword
はvarchar
型です。
weights
は、検索対象のカラムの重要度です。int[]
型です。
もし、column
がtext
型かvarchar
型なら、最初の要素がカラムの値の重要度になります。column
がtext[]
型なら、同じ位置の値がその値の重要度になります。
weights
をNULL
にできます。weights
の要素もNULL
にできます。対応する重要度がNULL
の場合は重要度は1
になります。
重要度が0
の場合は対応する値を無視します。たとえば、ARRAY[1, 0, 1]
は2番目の値は検索しないという意味になります。
scorers
はそれぞれの値のスコアーを計算する処理です。text[]
型です。もし、column
がtext
型かvarchar
型なら、最初の要素がカラムの値のスコアーを計算します。column
がtext[]
型なら、同じ位置の値がその値のスコアーを計算します。
scorers
をNULL
にできます。scorers
の要素もNULL
にできます。対応するスコアラーがNULL
の場合は単語の出現数をスコアーにするスコアラーを使います。
スコアラーの詳細はGroongaのスコアラーのドキュメントを参照してください。
スコアラーの最初の引数には$index
を指定しなければいけないことに注意してください。
例:
'scorer_tf_at_most($index, 0.25)'
$index
は内部的に適切なGroongaのインデックス名に置き換えられます。
index_name
は対応するPGroongaのインデックス名です。text
型です。
index_name
にはNULL
を指定できます。
これはシーケンシャルサーチのときにもPGroongaのインデックスに指定した検索オプションを使えるようにするために使われます。
2.0.6から使えます。
この演算子を使うには次のどれかの演算子クラスを指定する必要があります。
pgroonga_text_full_text_search_ops_v2
:text
型のデフォルト
pgroonga_text_array_full_text_search_ops_v2
:text[]
型のデフォルト
pgroonga_varchar_full_text_search_ops_v2
:varchar
用
pgroonga_text_full_text_search_ops
:text
用
pgroonga_text_array_full_text_search_ops
:text[]
用
pgroonga_varchar_full_text_search_ops
:varchar
用
例に使うサンプルスキーマとデータは次の通りです。
CREATE TABLE memos (
id integer,
content text
);
CREATE INDEX pgroonga_content_index ON memos USING pgroonga (content);
INSERT INTO memos VALUES (1, 'PostgreSQLはリレーショナル・データベース管理システムです。');
INSERT INTO memos VALUES (2, 'Groongaは日本語対応の高速な全文検索エンジンです。');
INSERT INTO memos VALUES (3, 'PGroongaはインデックスとしてGroongaを使うためのPostgreSQLの拡張機能です。');
INSERT INTO memos VALUES (4, 'groongaコマンドがあります。');
&@
演算子を使うと1つキーワードで全文検索できます。
SELECT * FROM memos WHERE content &@ '全文検索';
-- id | content
-- ----+---------------------------------------------------
-- 2 | Groongaは日本語対応の高速な全文検索エンジンです。
-- (1 row)
「タイトルは本文よりも重要」も実現できます。
例に使うサンプルスキーマとデータは次の通りです。
DROP TABLE IF EXISTS memos;
CREATE TABLE memos (
title text,
content text
);
CREATE INDEX pgroonga_memos_index
ON memos
USING PGroonga ((ARRAY[title, content]));
INSERT INTO memos VALUES ('PostgreSQL', 'PostgreSQLはリレーショナル・データベース管理システムです。');
INSERT INTO memos VALUES ('Groonga', 'Groongaは日本語対応の高速な全文検索エンジンです。');
INSERT INTO memos VALUES ('PGroonga', 'PGroongaはインデックスとしてGroongaを使うためのPostgreSQLの拡張機能です。');
INSERT INTO memos VALUES ('コマンドライン', 'groongaコマンドがあります。');
pgroonga_score
関数を使うと「Groonga
」により適したレコードを見つけられます。
SELECT *, pgroonga_score(tableoid, ctid) AS score
FROM memos
WHERE ARRAY[title, content] &@
('Groonga',
ARRAY[5, 1],
'pgroonga_memos_index')::pgroonga_full_text_search_condition
ORDER BY score DESC;
-- title | content | score
-- ----------------+---------------------------------------------------------------------------+-------
-- Groonga | Groongaは日本語対応の高速な全文検索エンジンです。 | 6
-- PGroonga | PGroongaはインデックスとしてGroongaを使うためのPostgreSQLの拡張機能です。 | 1
-- コマンドライン | groongaコマンドがあります。 | 1
-- (3 rows)
content
カラムに「Groonga
」を含むレコードよりも、title
カラムに「Groonga
」を含むレコードのほうが高いスコアになっています。
2番目の重みの値に0
を指定するとcontent
カラムを無視できます。
SELECT *, pgroonga_score(tableoid, ctid) AS score
FROM memos
WHERE ARRAY[title, content] &@
('Groonga',
ARRAY[5, 0],
'pgroonga_memos_index')::pgroonga_full_text_search_condition
ORDER BY score DESC;
-- title | content | score
-- ---------+---------------------------------------------------+-------
-- Groonga | Groongaは日本語対応の高速な全文検索エンジンです。 | 5
-- (1 row)
スコアーの計算方法をカスタマイズできます。たとえば、content
カラムのスコアーを最大で0.5
に制限できます。
SELECT *, pgroonga_score(tableoid, ctid) AS score
FROM memos
WHERE ARRAY[title, content] &@
('Groonga',
ARRAY[5, 1],
ARRAY[NULL, 'scorer_tf_at_most($index, 0.5)'],
'pgroonga_memos_index')::pgroonga_full_text_search_condition_with_scorers
ORDER BY score DESC;
-- title | content | score
-- ----------------+---------------------------------------------------------------------------+-------
-- Groonga | Groongaは日本語対応の高速な全文検索エンジンです。 | 5.5
-- PGroonga | PGroongaはインデックスとしてGroongaを使うためのPostgreSQLの拡張機能です。 | 0.5
-- コマンドライン | groongaコマンドがあります。 | 0.5
-- (3 rows)
複数のキーワードで全文検索したいときやAND/ORを使った検索をしたいときは&@~
演算子を使います。
複数のキーワードでOR全文検索をしたいときは&@|
演算子を使います。