Spanner Graph で全文検索を使用する

このページでは、Spanner Graph で全文検索を使用する方法について説明します。

Spanner Graph は、グラフ検索と全文検索を 1 つのシステムに統合します。この組み合わせにより、グラフ内の関係と組み合わせて非構造化データから分析情報を導き出すことができます。

始める前に

このページの例を実行するには、Google Cloud コンソールを使用して Spanner Graph を設定しクエリを実行する手順を実施する必要があります。これらの手順は次の処理を行います。

  1. インスタンスを作成する
  2. データベースを作成する
  3. Spanner Graph データベースのスキーマを作成する
  4. グラフデータを挿入する

トークンと検索インデックスを作成する

全文検索を使用する最初のステップは、検索対象のコンテンツをトークン化して検索インデックスを作成することです。全文検索では、検索インデックスに対してクエリが実行されます。

次の例では、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);

AccountAccountTransferAccount に新しい列が追加され、検索関数で新しいグラフ プロパティとしてアクセスするため、次のステートメントを使用してプロパティグラフの定義を更新する必要があります(詳しくは、既存のノードまたはエッジの定義を更新するをご覧ください)。

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
  );

グラフデータに対して全文検索を使用できるようになりました。

検索グラフ ノードのプロパティ

この例では、グラフ内のノードを検索して、その関係を調べる方法を示します。

  1. 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;
    
  2. 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
    

検索グラフのエッジ プロパティ

この例では、グラフ内の特定のエッジを検索する方法を示します。

  1. AccountTransferAccount.notes をテキスト メッセージで更新します。

    UPDATE AccountTransferAccount SET notes = 'for trip fund'
    WHERE id = 16 AND to_id = 20;
    UPDATE AccountTransferAccount SET notes = '&lt;trip&#39;s very fun!&gt;'
    WHERE id = 20 AND to_id = 7;
    UPDATE AccountTransferAccount SET notes = 'book fee'
    WHERE id = 20 AND to_id = 16;
    
  2. 全文検索を使用して、「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      &lt;trip&#39;s very fun!&gt;
    16      20     for trip fund
    

検索関数は、テキストに HTML タグが含まれていても、最初の結果を正しく取得しました。

次のステップ