我需要以Quill-Delta格式存储文本,这是一个JSON数组的形式。
-----------------------------------------------------------------
| id | title | content |
-----------------------------------------------------------------
| 10 | Hello | [ { "insert": "Hello" }, { "insert": "World" } ] |
| 20 | Image | [ { "insert": { "image": "data:image/j..." } } ] |
-----------------------------------------------------------------然后,我需要查询它,例如选择包含"hello world“的文本的位置,例如:
content的“你好世界”,我会得到第10行;content的“插入”,我没有得到任何结果;content表单“图像”,我将不会得到任何结果。实际上,它应该只搜索数组对象的insert键,其中值是JSON (没有其他类型)。
我能在Postgres中实现这一存储数据吗?我读过关于在JSONB上进行全文搜索的文章,但是我想不出一个有用的例子。
发布于 2019-03-04 15:16:13
我提出了一个函数和一个索引;这是一个函数,它接受insert JSON-String键并从它们构建一个tsvector:
create or replace function public.fts_quill_delta(lang regconfig, delta text) returns tsvector as
$
begin
return to_tsvector(lang, string_agg(value->>'insert', ' ')) from jsonb_array_elements(delta::jsonb) where jsonb_typeof(value->'insert') = 'string';
end;
$
language 'plpgsql' immutable;这是一个指数:
create index content_delta_fts on my_table using gin(fts_quill_delta(lang, content));然后,您可以使用以下方法查询索引:
select from my_table where fts_quill_delta(lang, content) @@ 'hello & world'注意,我添加了一个lang列,由FTS引擎使用它来使用正确的I18N设置。
https://dba.stackexchange.com/questions/230370
复制相似问题