将全文搜索与 Spanner Graph 搭配使用

本页面介绍了如何在 Spanner Graph 中使用全文搜索

Spanner Graph 将图表和全文搜索组合在一个系统中。这种组合可让您结合图表中的关系从非结构化数据中获得分析洞见。

准备工作

如需运行本页面上的示例,您需要执行使用 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”的转移边缘。使用图表遍历查找这些转移的来源节点和目标节点。

    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 标记。

后续步骤