すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:全文検索

最終更新日:Sep 29, 2024

全文検索は、自然言語テキストデータを照会可能データに変換するデータベース機能です。 AnalyticDB for PostgreSQLは、PostgreSQLエンジンを使用してワンストップ全文検索機能を提供します。 このトピックでは、AnalyticDB for PostgreSQLの全文検索機能の使用方法について説明します。

背景情報

デジタル時代が展開するにつれて、データはより多くのソースから取得され、より幅広い方法を使用して生成されます。 これには大量のテキストデータが含まれます。 ほとんどの場合、データベースまたはデータウェアハウスはテキストデータを格納するために使用されます。 ただし、テキストデータから貴重な情報を抽出して分析するには、複数のデータ処理システムを使用する必要があります。 これにより、ユーザーの要件とメンテナンスコストが高くなります。

データウェアハウスを使用してテキストデータを処理および分析する場合、データウェアハウスにリアルタイムデータ書き込み、フルテキスト検索、ジョブスケジューリングなどの機能が用意されていることを確認する必要があります。 単一のデータウェアハウスで上記の機能を実現するには、次の課題があります。

  • すべてのデータウェアハウスエンジンがフルテキスト検索機能を提供するわけではありません。 データウェアハウスにフルテキスト検索機能がない場合は、データをデータウェアハウスにインポートする前に、テキストデータを準備して処理するための追加の開発作業を実行する必要があります。

  • ジョブスケジューリングは、データウェアハウスエンジンのSQL標準のサポートと外部ツールの強力なサポートに依存しています。

  • フルテキスト検索では、大量のテキストデータを処理しますが、データウェアハウスでは、テキストデータの処理に数値データの処理と同じレベルのパフォーマンスが得られません。

  • 特定のデータウェアハウスエンジンは、柔軟な構成変更機能を提供しない。

AnalyticDB for PostgreSQLは、全文検索およびデータ処理機能を提供し、上記の課題に対処できます。

概要

ほとんどの場合、全文検索アプリケーションは、データベースに格納されているテキストデータから特定の単語を見つけ、出現回数に基づいて単語をソートします。

ほとんどのデータベースは、基本的なテキスト検索機能を提供します。 たとえば、クエリでLIKEなどの式を使用してテキストデータを検索できます。 ただし、この方法には、最新のデータベースアプリケーションでは次の欠点があります。

  • データベースで一般的に使用される式ベースのクエリメソッドは、デリバティブなどの構文を処理できません。 例えば、fishlesは、英語の単語fishmentの導関数である。 データをクエリするためのキーワードとしてfishiveを使用すると、fishingsに関連するクエリ結果が欠落する可能性があります。 これは、フルテキスト検索の要件を満たすことができません。 OR式を使用して、満たす満たすを同時に一致させることができます。 しかし、この操作は非効率的であり、特定の単語には多数の派生語があるため、エラーが発生しやすい。

  • 式ベースのクエリメソッドでは、一致する結果を効率的にソートできません。 大量のクエリ結果が返された場合、ソート結果は非効率的です。

  • 式ベースのクエリメソッドは、クエリのパフォーマンスが低く、効率的なインデックスを作成できません。 テキストデータ全体をトラバースする必要があります。

AnalyticDB for PostgreSQLは、上記の問題を解決するワンストップ全文検索機能を提供します。

全文検索の機能

AnalyticDB for PostgreSQLの全文検索機能は、テキストデータを事前計算することで高速なクエリパフォーマンスを提供します。 事前計算には、次の操作が含まれます。

  1. テキストデータをシンボルに解析します。 記号は、テキスト単語を数字、形容詞、副詞などのさまざまなタイプに分類するために使用されます。 異なるタイプのシンボルを異なる動作で処理することができる。 PostgreSQLエンジンは、デフォルトのパーサーを使用してテキストデータをシンボルに解析し、さまざまな言語のテキストデータにカスタムパーサーを使用できます。

  2. シンボルを単語に変換します。 記号と比較して、単語は、満たす満たすなど、異なる形式の組み合わせに正規化されます。 これにより、セマンティクスに基づく全文検索の効率的なパフォーマンスが実現します。 PostgreSQLエンジンは辞書を使用してシンボルを単語に変換し、カスタム辞書を設定できます。

  3. ワードストレージを最適化し、効率的なクエリを実行します。 たとえば、PostgreSQLエンジンは、テキストデータを解析して単語情報を持つソート済みデータに変換するためのテキスト検索ベクトル (TSVECTOR) 型を提供します。 PostgreSQLエンジンは、効率的なフルテキスト検索を実現するために、テキスト検索クエリ (TSQUERY) タイプも提供します。

TSVECTOR

TSVECTOR値は、位置情報を有する別個の単語のソートされたリストである。 PostgreSQLのto_tsvector構文を使用して、テキストデータをTSVECTOR値に変換できます。 たとえば、「太った猫がマットに飛び乗って2匹の太ったネズミを食べた」という文をソートされたデータに変換します。

postgres=# SELECT to_tsvector('a fat cat jumped on a mat and ate two fat rats');
                          to_tsvector
---------------------------------------------------------------
 'ate':9 'cat':3 'fat':2,11 'jump':4 'mat':7 'rat':12 'two':10
(1 row)

to_tsvector構文のクエリ結果には、ソートされた単語のリストが含まれます。 各単語の後には、文章中のその位置情報が続く。 たとえば、fat':2,11は、単語fatが文の位置2と11にあることを示します。 さらに、to_tsvector構文のクエリ結果は、文の結合を省略し、特定の単語を正規化します。 たとえば、ジャンプはジャンプに正規化されます。

to_tsvector構文は、テキストデータの事前計算と変換を完了します。

TSQUERY

TSQUERY値には、検索する単語が格納されます。 PostgreSQLのto_tsquery構文を使用してテキストデータをTSQUERY値に変換し、to_tsvector構文と全文検索演算子を使用して全文検索を実装できます。

to_tsquery構文は、@ @ (CONTAINS) 演算子と、& (and) 、| (OR) 、! などのブール演算子の組み合わせをサポートします。 (NOT) 。

たとえば、@ @ 演算子を使用して、TSVECTOR値にTSQUERY値が含まれているかどうかを照会します。

postgres=# SELECT to_tsvector('a fat cat jumped on a mat and ate two fat rats') @@ to_tsquery('cat');
 ?column?
----------
 t
(1 row)

postgres=# SELECT to_tsvector('a fat cat jumped on a mat and ate two fat rats') @@ to_tsquery('cats');
 ?column?
----------
 t
(1 row)

postgres=# SELECT to_tsvector('a fat cat jumped on a mat and ate two fat rats') @@ to_tsquery('cat | dog');
 ?column?
----------
 t
(1 row)

postgres=# SELECT to_tsvector('a fat cat jumped on a mat and ate two fat rats') @@ to_tsquery('cat & dog');
 ?column?
----------
 f
(1 row)

単語catのクエリ結果はtで、trueを示します。 catcatの複数形であるため、単語のcatのクエリ結果もtです。

距離検索

重要

AnalyticDB for PostgreSQL V7.0インスタンスのみが距離検索をサポートしています。

フルテキスト検索機能を使用して、テキストに単語が含まれているかどうかを照会し、フレーズをさらに分析することができます。 PostgreSQLのto_tsqueryメソッドは、フレーズ検索演算子 <N> をサポートしています。 整数Nは、ワード間の距離を指定する。 たとえば、テキストにcatという単語の後にjump句が続くかどうかを照会する場合は、<1> 演算子を使用できます。

postgres=# SELECT to_tsvector('a fat cat jumped on a mat and ate two fat rats') @@ to_tsquery('cat<1>jump');
 ?column?
----------
 t
(1 row)

特定のフレーズをクエリするには、距離検索方法を使用することもできます。

postgres=# SELECT to_tsvector('a fat cat jumped on a mat and ate two fat rats') @@ to_tsquery('cat<2>mat');
 ?column?
----------
 f
(1 row)

postgres=# SELECT to_tsvector('a fat cat jumped on a mat and ate two fat rats') @@ to_tsquery('cat<4>mat');
 ?column?
----------
 t
(1 row)

AnalyticDB for PostgreSQLは、PostgreSQLの全文検索機能に基づいて詳細な開発を実行し、全文検索用の距離検索演算子 <N,M> をサポートします。 整数MおよびNは、NからMまでの単語間の距離の範囲を指定する。たとえば、単語catmatの間の距離が5以下のフレーズがテキストに含まれているかどうかを照会する場合は、<1,5> 演算子を使用できます。

postgres=# SELECT to_tsvector('a fat cat jumped on a mat and ate two fat rats') @@ to_tsquery('cat<1,5>mat');
 ?column?
----------
 t
(1 row)

中国語の単語セグメンテーション: zhparser拡張

特定のデータベースアプリケーションは、ユーザーコメントテーブルや住所情報など、大量の中国語テキストデータを保存します。 中国語のテキストデータを分析するには、全文検索機能が必要です。 中国語の単語は最小意味単位であり、英語の単語と同じようにスペースで区切られていません。 PostgreSQLのデフォルトの全文検索エンジンは、中国語のセマンティクスの単語セグメンテーション要件を満たすことができません。

単純中国語単語セグメンテーション (SCWS) は、単語頻度辞書に基づくオープンソースの中国語単語セグメンテーションエンジンです。 SCWSは、中国語のテキストを適切な単語に分割できます。 SCWSはC言語で開発され、アプリケーションにアクセスするためのダイナミックリンクライブラリとして使用できます。 PostgreSQLのコード拡張機能と組み合わせることで、SCWSを使用してPostgreSQLデータベースに中国語の単語セグメンテーションを実装できます。

Zhparserは、SCWSの機能に基づいて開発されたPostgreSQL中国語の単語セグメンテーション拡張機能です。 ZhparserはPostgreSQLの全文検索機能と互換性があり、幅広い機能構成オプションとカスタム辞書を提供します。

デフォルトでは、zhparser拡張はAnalyticDB for PostgreSQLに組み込まれています。 中国語の単語セグメンテーション要件に基づいてzhparser拡張を設定できます。 たとえば、zh_cnという名前の中国語の単語分割パーサーを作成し、単語分割ポリシーを設定します。

--- Create a Chinese word segmentation parser. 
CREATE TEXT SEARCH CONFIGURATION zh_cn (PARSER = zhparser);
--- Configure noun (n), verb (v), adjective (a), idiom (i), exclamation (e), temporary idiom (l), and custom (x) word segmentation policies. 
ALTER TEXT SEARCH CONFIGURATION zh_cn ADD MAPPING FOR n,v,a,i,e,l,x WITH simple; 

基本設定を完了したら、中国語の単語セグメンテーション機能を使用して、中国語のテキスト検索を開発できます。

to_tsquery構文とzhparser拡張子を使用してテキスト検索を実行できます。

zhparser拡張機能の詳細については、「zhparser」をご参照ください。

カスタム辞書

zhparser拡張は、カスタム中国語辞書をサポートします。 デフォルトの辞書が単語セグメンテーションの要件を満たさない場合は、カスタム辞書を使用してクエリ結果をリアルタイムで最適化できます。 zhparserのシステムテーブルzhparser.zhprs_custom_wordは、ユーザー指向のカスタム辞書テーブルです。 カスタム辞書は、システムテーブルを更新することによってのみ使用できます。 zhparser.zhprs_custom_wordテーブルは、次のスキーマを使用します。

                   Table "zhparser.zhprs_custom_word"
 Column |       Type       | Collation | Nullable |        Default
--------+------------------+-----------+----------+-----------------------
 word   | text             |           | not null |
 tf     | double precision |           |          | '1'::double precision
 idf    | double precision |           |          | '1'::double precision
 attr   | character(1)     |           |          | '@'::bpchar
Indexes:
    "zhprs_custom_word_pkey" PRIMARY KEY, btree (word)
Check constraints:
    "zhprs_custom_word_attr_check" CHECK (attr = '@'::bpchar OR attr = '!'::bpchar)

単語列にはカスタム単語が含まれています。 tf列とidf列は、カスタム単語の重みを指定するために使用されます。 TF-IDFは、頻度-逆ドキュメント頻度という用語の略です。 attr列は、カスタムワードのワードセグメントおよびストップワード属性を定義します。

AnalyticDB for PostgreSQLは、データベースレベルのカスタム辞書を提供します。 辞書は、各データノードのデータベースのデータディレクトリに格納される。

フルテキスト検索インデックス

全文検索には、大量のテキストデータが含まれる場合があります。 適切なインデックスは、クエリのパフォーマンスを効果的に向上させます。 転置インデックスは、データと位置の関係を格納するデータ構造です。 転置インデックスを使用して、データシステム内の大量のテキストデータを検索できます。

AnalyticDB for PostgreSQLは、TSVECTORデータのクエリパフォーマンスを向上させるための一般化転置インデックス (GIN) 機能を提供します。

CREATE INDEX text_idx ON document USING GIN (to_tsvector('zh_cn',text));

関連ドキュメント

AnalyticDB for PostgreSQLを使用してColourDataがフルテキスト検索、データ処理、およびデータ分析を実装できるようにします