【发布时间】:2017-04-23 17:15:40
【问题描述】:
我目前正在优化我在 PostgreSQL 的 jsonb 字段上的搜索结果。我正在使用 Postgres 9.6。我的最终目标是在我的 jsonb 文档中搜索多个字段,并根据它们在所有字段中的总命中数对结果进行排名。但是我被卡住了,因为 ts_rank 函数不使用我的索引并且极大地减慢了搜索速度。这是一个最小的例子:
CREATE TABLE book (
id BIGSERIAL NOT NULL,
data JSONB NOT NULL
);
CREATE INDEX book_title_idx
ON book USING GIN (to_tsvector('english', book.data ->> 'title'));
INSERT INTO book (data)
VALUES (CAST('{"title": "Cats"}' AS JSONB));
当我尝试搜索标题字段时,我正在使用此查询:
EXPLAIN ANALYZE
SELECT *
FROM (
SELECT
id,
data ->> 'title' AS title,
ts_rank(title_query, 'cat:*') AS score
FROM
book,
to_tsvector('english', data ->> 'title') title_query
WHERE title_query @@ to_tsquery('cat:*')
ORDER BY score DESC) a
WHERE score > 0
ORDER BY score DESC;
如果没有对我的真实数据进行排名,则搜索需要
【问题讨论】:
标签: postgresql indexing full-text-search ranking jsonb