フルテキストクエリとは、テキストデータに対して全文検索または検索を行う操作です。フルテキストクエリは、テキスト全体をより包括的に検索し、検索条件に一致する結果を返します。
説明
OceanBaseデータベースV4.4.2バージョンでは、OracleモードはV4.4.2 BP2バージョンからフルテキストインデックスの作成をサポートしています。
構文
以下のステートメントを使用してフルテキストインデックスクエリを実行します。フルテキストインデックス列を指定し、search_query との一致度を調べます。結果は、行と search_query の関連度を表す非負の DOUBLE 値として返され、0は関連性がないことを意味します。
CONTAINS(indexed_column, 'search_query' [, score_label])
SCORE(score_label)
パラメータ説明:
indexed_column:フルテキストインデックスの列名を表します。search_query:VARCHAR2型またはCLOB型で、検索するキーワードまたはフレーズを表します。サポートされている検索演算子は以下のとおりです:空白:連続するフレーズのマッチングを表し、隣接して現れる単語を順序通りにマッチングします。例:'word1 word2'。二重引用符""または大括弧{}を使用したエスケープがサポートされています。例えば、連続するフレーズ "law and order" を検索する場合、'law and order'と直接書くとlaw AND order(論理積)と解釈されます。解決策:- 大括弧を使用する:
'{law and order}'。 - 二重引用符を使用する:
'"law and order"'。
- 大括弧を使用する:
説明
search_queryパラメータのクエリ内容が対応するトークナイザーで生成される分詞数が多すぎると、システムリソースの消費が増加し、応答速度が低下し、クエリのパフォーマンスに影響を与える可能性があります。最適な実行効率を得るために、クエリを簡潔かつ適切に保つことを推奨します。score_label:オプションパラメータで、NUMBER型です。返される結果のマッチング番号を表します。SCORE():オプションパラメータで、NUMBER型です。score_labelと組み合わせて使用し、score_labelはCONTAINSで指定されたscore_labelである必要があります。CONTAINSのマッチングスコア(関連性が高いほど高い)を出力するために使用されます。
使用上の制限と注意事項
indexed_columnが存在しない場合、エラーが発生します。indexed_columnにフルテキストインデックスが作成されていない場合、エラーが発生します。search_queryがNULLの場合、エラーが発生します。例:SELECT col1 FROM tbl1 WHERE CONTAINS(col2, NULL, 1) > 0;。search_queryが空文字列の場合、空を返します。例:SELECT col1 FROM tbl1 WHERE CONTAINS(col2, '', 1) > 0;。search_queryがすべて空白の場合、空を返します。例:SELECT col1 FROM tbl1 WHERE CONTAINS(col2, ' ', 1) > 0;。score_labelが負の数値の場合、エラーが発生します。例:SELECT col1 FROM tbl1 WHERE CONTAINS(col2, 'OceanBase', -1) > 0;。SCOREタグが定義されていない場合、エラーが発生します。例:SELECT col1 FROM tbl1 WHERE CONTAINS(col2, 'OceanBase', 1) > 0 ORDER BY SCORE(999);。CONTAINSの文脈がない場合にSCOREが使用されると、エラーが発生します。例:SELECT SCORE(1) FROM tbl1;。GROUP BY句やHAVING句でのSCOREの使用はサポートされていません。CONTAINSが比較されていない場合、エラーが発生します。例:SELECT col1 FROM tbl1 WHERE CONTAINS(col2, 'OceanBase', 1);。CONTAINSで小さい、等しい、または小さい・等しい比較を使用すると、エラーが発生します。例:SELECT col1 FROM tbl1 WHERE CONTAINS(col2, 'OceanBase', 1) <= 0;。- フルテキストフィルターを使用した連結クエリやテーブル名の変更を行うと、エラーが発生します。例:
SELECT SCORE(1) FROM tbl2 t1 WHERE CONTAINS(t1.col2, 'OceanBase', 1) >0;。
例
テーブル
tbl1を作成します。obclient> CREATE TABLE tbl1( col1 INT, col2 CHAR(50), col3 VARCHAR2(500));フルテキストインデックス
ft_idx1_tbl1を作成します。obclient> CREATE INDEX ft_idx1_tbl1 ON tbl1(col2) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('LEXER SPACE') LOCAL;フルテキストインデックス
ft_idx2_tbl1を作成します。obclient> CREATE INDEX ft_idx2_tbl1 ON tbl1(col3) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('LEXER SPACE') LOCAL;テーブル
tbl1にテストデータを追加します。obclient> INSERT INTO tbl1 (col1, col2, col3) VALUES (1, 'Hello World', 'This is a test'), (2, 'OceanBase', 'OceanBase Database is a native, enterprise-level distributed database developed independently by the OceanBase team'), (3, 'Database Management', 'Learn about SQL and database administration'), (4, 'Full Text Searching', 'Master the art of full text searching');実行結果は次のとおりです:
Query OK, 4 rows affected Records: 4 Duplicates: 0 Warnings: 0CONTAINSを使用してクエリを実行します。obclient> SELECT * FROM tbl1 WHERE CONTAINS(col2, 'OceanBase', 1) > 0;実行結果は次のとおりです:
+------+----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+ | COL1 | COL2 | COL3 | +------+----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+ | 2 | OceanBase | OceanBase Database is a native, enterprise-level distributed database developed independently by the OceanBase team | +------+----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+ 1 row in setCONTAINSを使用してクエリを実行し、SCOREでソートします。obclient> SELECT col1, col2, col3, SCORE(1) FROM tbl1 WHERE CONTAINS(col2, 'Database', 1) > 0 AND col1 >= 2 ORDER BY SCORE(1) DESC;実行結果は次のとおりです:
+------+----------------------------------------------------+---------------------------------------------+------------------------+ | COL1 | COL2 | COL3 | SCORE(1) | +------+----------------------------------------------------+---------------------------------------------+------------------------+ | 3 | Database Management | Learn about SQL and database administration | 1.259496819494492E+000 | +------+----------------------------------------------------+---------------------------------------------+------------------------+ 1 row in set複数のクエリを実行し、
score_labelを使用してSCOREの結果を出力します。obclient> SELECT col1, col2, col3, SCORE(10), SCORE(20) FROM tbl1 WHERE CONTAINS (col2, 'Database', 10) > 0 OR CONTAINS (col3, 'OceanBase', 20) > 0 ORDER BY SCORE(10), SCORE(20);実行結果は次のとおりです:
+------+----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+------------------------+-------------------------+ | COL1 | COL2 | COL3 | SCORE(10) | SCORE(20) | +------+----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+------------------------+-------------------------+ | 2 | OceanBase | OceanBase Database is a native, enterprise-level distributed database developed independently by the OceanBase team | 0 | 1.1331643117640413E+000 | | 3 | Database Management | Learn about SQL and database administration | 1.259496819494492E+000 | 0 | +------+----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+------------------------+-------------------------+ 2 rows in set