0

给定以下数据集:

-- Create random table
CREATE TABLE sample (
    id serial primary key,
    content jsonb
);

-- Insert sample rows
INSERT INTO sample (content)
VALUES 
    ('{"text": ["Lorem ipsum dolor sit amet","consectetur adipiscing elit","sed do eiusmod tempor incididunt","ut labore et dolore magna aliqua"]}'), 
    ('{"text": ["Ut enim ad minim veniam","quis nostrud exercitation ullamco laboris","nisi ut aliquip ex ea commodo consequat","Duis aute irure dolor in reprehenderit","voluptate velit esse cillum dolore"]}'), 
    ('{"text": ["eu fugiat nulla pariatur","Excepteur sint occaecat cupidatat","non proident, sunt in culpa qui","officia deserunt mollit anim id est laborum"]}')
;

content是一个 JSONB 列,其中包含text一个 Json 文本数组的键。

我希望能够ILIKE使用索引在此文本中搜索或类似功能。

从功能上讲,这是可行的,这就是我想做的:

WITH ctr AS (
    SELECT id, jsonb_array_elements_text((content->>'text')::jsonb) as mytext
    FROM sample
)
SELECT id
FROM ctr
WHERE mytext ILIKE '%qui%';

 id 
----
  2
  2
  3
(3 rows)

是否有使用索引具有相同输出的解决方案?我正在寻找一个非常大的数据集。

看起来不可能使用三元组索引 ( ERROR: operator class "gist_trgm_ops" does not accept data type jsonb)

4

1 回答 1

0

您可以使用正则表达式

create index idx_name on sample ((content->>'text'));

select sample.*
from sample
where content->>'text' ~ ' qui';

select sample.* 
from sample, jsonb_array_elements_text(content->'text') many(elem)
where elem ~ ' qui';

此外,从 Postgresql 版本 12+ 开始,您可以使用“like_regex”在您的 JSONB 列中进行搜索。

https://www.postgresql.org/docs/current/functions-json.html

查看Selecting for a Jsonb array contains regex matchHow to create index on json field in Postgres 9.3

于 2020-07-22T14:06:51.100 回答