BigQueryでN-gramの検索を再現する方法

#standardSQL

全文検索エンジンでよくあるテキストとクエリ(キーワード)の対が与えられたときにN-gramでの検索のフィルター機能をBigQueryで再現する方法

N-gram の箇所はこの記事を参考にさせていただきました

https://qiita.com/shiozaki/items/8cd0bf9301cfddddc81c

#standardSQL

CREATE TEMPORARY FUNCTION NGRAM(str STRING, n INT64)
RETURNS ARRAY<STRING> AS ((
SELECT ARRAY(SELECT SUBSTR(str, seq, n) FROM UNNEST(T.seqs) AS seq)
FROM (
SELECT str, GENERATE_ARRAY(1, LENGTH(str) - n + 1) AS seqs
) AS T
));

CREATE TEMPORARY FUNCTION
ALL_MATCH_NGRAM(index STRING, keyword STRING, n INT64)
RETURNS BOOL AS ((
SELECT
match_num = min_length
FROM (
SELECT
count(*) as match_num,
CASE WHEN LENGTH(index)<LENGTH(keyword) THEN LENGTH(index)-n+1 ELSE LENGTH(keyword)-n+1 END as min_length
FROM
(SELECT NGRAM(keyword, n) as keyword_ngram), UNNEST(keyword_ngram) kw, (SELECT NGRAM(index, n) as index_ngram), UNNEST(index_ngram) t_index
WHERE
kw=t_index
)
));

WITH
index AS (
SELECT
"吾輩は猫である。名前はまだない。" as text
),

query AS (
SELECT
"吾輩は猫" as keyword1
)

SELECT
text,
keyword1,
ALL_MATCH_NGRAM(text, keyword1,2)
FROM
index, query

ALL_MATCH_NGRAM というのがそれ。これであってる(はず)

なんども利用する文字列は事前に別にN-gramにかけておいたほうが計算効率は良いかもしれない。転置インデックスもどきテーブル