Skip to content

NonceGeek/supabase-cn-text-search-demo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

supabase-cn-text-search-demo

Demo for cn text-search based on supabase(postgresql).

项目要求

GitHub bounty地址:地址

Q & A

Q:中文全文检索是要达成怎样的效果呢?

A:

需要在 Supabase 里调用,最好使用 deno 方案。 可以参考这篇英文全文检索的文档:地址。 把它改成中文检索指南。目标就是实现一个建议搜索引擎。 我理解是在查询前做分词,然后将分词结果存储在一个 array 字段里,全文检索通过检索 array 字段实现。 用 sql 写查询方法。然后通过 supabase.rpc调用。 这里有一个我之前写的例子:地址

Q:可以能给我看一下SQL函数embedding_search_bodhi_text_assets_k_v_space_145是怎么写的吗?

A:

create or replace function embedding_search_bodhi_text_assets_k_v_space_145 (
  query_embedding vector(3072),
  match_threshold float,
  match_count int
)
returns table (
  id int,
  data text,
  metadata json,
  creator text,
  id_on_chain int,
  similarity float
)
language sql stable
as $$
  select
    bodhi_text_assets_k_v_space_145.id,
    bodhi_text_assets_k_v_space_145.data,
    bodhi_text_assets_k_v_space_145.metadata,
    bodhi_text_assets_k_v_space_145.creator,
    bodhi_text_assets_k_v_space_145.id_on_chain,
    1 - (bodhi_text_assets_k_v_space_145.embedding_1024 <=> query_embedding) as similarity
  from bodhi_text_assets_k_v_space_145
  where bodhi_text_assets_k_v_space_145.embedding_1024 <=> query_embedding < 1 - match_threshold
  order by bodhi_text_assets_k_v_space_145.embedding_1024 <=> query_embedding
  limit match_count;
$$;

项目提交地址:地址

项目实现原理

  1. 在supabase中新建一个数据库,获取到SUPABASE_KEY和SUPABASE_URL,在env文件里写入这两个值
SUPABASE_KEY=XXX
SUPABASE_URL=https://XXX.supabase.co
  1. 使用以下SQL语句创建测试用例表并且插入测试用例数据
CREATE TABLE books (  
  id SERIAL PRIMARY KEY,  
  title TEXT,  
  author TEXT,  
  description TEXT  
);  

create index books_description_pgroonga_idx
on books
using pgroonga (description);
  
INSERT INTO books  
  (title, author, description)  
VALUES  
  (  
    '小懒狗',  
    '简妮特·塞布林·洛里',  
    '这只小狗比其他更大些的动物动作更慢。'  
  ),  
  (  
    '彼得兔的故事',  
    '碧翠克斯·波特',  
    '小兔子彼得爱吃各种蔬菜。'  
  ),  
  (  
    '托特尔',  
    '葛丽塔·克兰普顿',  
    '小火车托特尔怀揣着伟大的梦想。'  
  ),  
  (  
    '绿鸡蛋和火腿',  
    '苏斯博士',  
    '萨姆改变了饮食偏好,开始吃颜色不寻常的食物。'  
  ),  
  (  
    '哈利·波特与火焰杯',  
    'J.K. 罗琳',  
    '哈利迎来第四年的霍格沃茨生活,随之而来的是巨大的挑战和戏剧性事件。'  
  ),  
  (  
    '彼得兔的故事2',  
    '彼得兔的故事2',  
    '彼得兔的故事2'  
  );
  1. 写一个postgreSQL函数来支持中文搜索
create or replace function search_books (  
  query_text text,  
  max_results int  
)  
returns table (  
  id int,  
  title text,  
  author text,  
  description text  
)  
language sql stable  
as $$  
  select  
    books.id,  
    books.title,  
    books.author,  
    books.description  
  from books  
  where description &@~ '';  
  order by books.id  
  limit max_results;  
$$;
  1. 使用DENO来调用该PostgreSQL函数
import { createClient } from "https://esm.sh/@supabase/supabase-js@2";  
// Import the load function from deno-dotenv  
import { config } from "https://deno.land/x/dotenv/mod.ts";  
  
// Load environment variables from the .env file  
const env = config();  
// Access the environment variables  
const supabaseUrl = env.SUPABASE_URL ?? "";  
const supabaseKey = env.SUPABASE_KEY ?? "";  
// create a new Supabase client  
const supabase = createClient(supabaseUrl, supabaseKey)  
// perform a stored procedure call  
const { data, error } = await supabase.rpc("search_books", {  
    query_text: "兔",  
    max_results: 2  
})  
  
console.log(data, error)

About

Demo for cn text-search based on supabase(postgresql).

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published