本页介绍了如何在 Spanner Graph 中使用全文搜索。
Spanner Graph 在一个系统中结合了图搜索和全文搜索。这种组合可让您结合图表中的关系,从非结构化数据中得出洞见。
准备工作
如需运行本页中的示例,您需要执行使用 Google Cloud 控制台中的相关步骤来设置和查询 Spanner 图。这些过程会执行以下操作:
创建令牌和搜索索引
使用全文搜索的第一步是将要搜索的内容进行分词,然后创建搜索索引。全文搜索会对搜索索引运行查询。
以下示例添加了 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
函数查找图中Account
节点,其nick_name
中包含“雨天”或“休假”。使用图遍历查找转入这些账号的金额。按搜索相关性为匹配项评分。按相关性降序排序并返回结果。请注意,您可以在同一搜索函数调用中查找令牌析取运算。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”的转移边。使用图遍历查找这些传输的源节点和目标节点。
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 标记,搜索函数仍正确检索到第一个结果。