このページでは、Spanner Graph で全文検索を使用する方法について説明します。
Spanner Graph は、グラフ検索と全文検索を 1 つのシステムに統合します。この組み合わせにより、グラフ内の関係と組み合わせて非構造化データから分析情報を導き出すことができます。
始める前に
このページの例を実行するには、Google Cloud コンソールを使用して Spanner Graph を設定しクエリを実行する手順を実施する必要があります。これらの手順は次の処理を行います。
トークンと検索インデックスを作成する
全文検索を使用する最初のステップは、検索対象のコンテンツをトークン化して検索インデックスを作成することです。全文検索では、検索インデックスに対してクエリが実行されます。
次の例では、nick_name_token
列を追加し、TOKENIZE_FULLTEXT 関数を使用して Account.nick_name
列のテキストをトークン化します。次に、nick_name_token
列に検索インデックスが作成されます。
ALTER TABLE Account
ADD COLUMN nick_name_token TOKENLIST
AS (TOKENIZE_FULLTEXT(nick_name)) STORED HIDDEN;
CREATE SEARCH INDEX AccountTextSearchIndex
ON Account(nick_name_token) STORING (nick_name);
次の例では、TOKENIZE_FULLTEXT 関数を使用して Account.nick_name
のテキストをトークン化し、トークンを含む nick_name_token
列に検索インデックスを作成します。
ALTER TABLE AccountTransferAccount
ADD COLUMN notes STRING(MAX);
ALTER TABLE AccountTransferAccount
ADD COLUMN notes_token TOKENLIST AS (TOKENIZE_FULLTEXT(notes)) STORED HIDDEN;
CREATE SEARCH INDEX TransferTextSearchIndex
ON AccountTransferAccount(notes_token) STORING (notes);
Account
と AccountTransferAccount
に新しい列が追加され、検索関数で新しいグラフ プロパティとしてアクセスするため、次のステートメントを使用してプロパティグラフの定義を更新する必要があります(詳しくは、既存のノードまたはエッジの定義を更新するをご覧ください)。
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (Account, Person)
EDGE TABLES (
PersonOwnAccount
SOURCE KEY (id) REFERENCES Person (id)
DESTINATION KEY (account_id) REFERENCES Account (id)
LABEL Owns,
AccountTransferAccount
SOURCE KEY (id) REFERENCES Account (id)
DESTINATION KEY (to_id) REFERENCES Account (id)
LABEL Transfers
);
グラフデータに対して全文検索を使用できるようになりました。
検索グラフ ノードのプロパティ
この例では、グラフ内のノードを検索して、その関係を調べる方法を示します。
Account.nick_name
をテキスト メッセージで更新。UPDATE Account SET nick_name = "Fund for vacation at the north pole" WHERE id = 7; UPDATE Account SET nick_name = "Fund -- thrill rides!" WHERE id = 16; UPDATE Account SET nick_name = "Rainy day fund for the things I still want to do" WHERE id = 20;
SEARCH
関数を使用して、nick_name
に「rainy day」または「vacation」のいずれかが含まれているグラフ内のAccount
ノードを検索します。グラフ トラバースを使用して、これらのアカウントに振り込まれた金額を確認します。検索の関連性に基づいて一致をスコアリングします。結果を関連性の降順で並べ替えて返します。同じ検索関数呼び出しでトークンの論理和を検索できます。GRAPH FinGraph MATCH (n:Account)<-[e:Transfers]-(:Account) WHERE SEARCH(n.nick_name_token, '"rainy day" | vacation') RETURN n.nick_name, e.amount AS amount_added ORDER BY SCORE(n.nick_name_token, '"rainy day" | vacation') DESC
結果:
nick_name amount_added Rainy day fund for the things I still want to do 300 Fund for vacation at the north pole 500
検索グラフのエッジ プロパティ
この例では、グラフ内の特定のエッジを検索する方法を示します。
AccountTransferAccount.notes
をテキスト メッセージで更新します。UPDATE AccountTransferAccount SET notes = 'for trip fund' WHERE id = 16 AND to_id = 20; UPDATE AccountTransferAccount SET notes = '<trip's very fun!>' WHERE id = 20 AND to_id = 7; UPDATE AccountTransferAccount SET notes = 'book fee' WHERE id = 20 AND to_id = 16;
全文検索を使用して、「trip」を含む Transfers エッジを見つけます。グラフ トレースを使用して、転送の送信元ノードと宛先ノードを探します。
GRAPH FinGraph MATCH (a:Account)-[e:Transfers WHERE SEARCH(e.notes_token, 'trip')]->(b:Account) RETURN a.id AS src_id, b.id AS dst_id, e.notes
結果:
src_id dst_id notes 20 7 <trip's very fun!> 16 20 for trip fund
検索関数は、テキストに HTML タグが含まれていても、最初の結果を正しく取得しました。