postgresql 在pgsql中存储数据以创建facet bucket的有效方法

iqxoj9l9  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(114)

我有一个产品相关的数据与它的fts索引做fts搜索。我知道有多种方法可以创建facet结果,但是我没有发现任何一种方法可以在15个以上的组中具有足够的性能。有没有人找到一种有效的方法来存储,过滤和分面数据,不需要大量的查询,并给出组->点击+计数?
我的数据集不是很大(60 k记录),我意识到可能有更好的解决方案,但如果一切都可以在一个db中完成,那就太好了
尝试的方法:https://bun.uptrace.dev/postgres/faceted-full-text-search-tsvector.html#creating-a-table,包含40 k项,运行:

explain analyse 

SELECT 
  split_part(word, ':', 1) AS attr,
  split_part(word, ':', 2) AS value,
  ndoc AS count
FROM ts_stat($$ SELECT tsvagg FROM product $$)
    order by word

执行时间3秒:

"Sort  (cost=814.41..839.41 rows=10000 width=100) (actual time=2897.014..3195.353 rows=162944 loops=1)"
"  Sort Key: word"
"  Sort Method: external merge  Disk: 27752kB"
"  ->  Function Scan on ts_stat  (cost=0.03..150.03 rows=10000 width=100) (actual time=1246.314..1349.076 rows=162944 loops=1)"
"Planning Time: 0.033 ms"
"Execution Time: 3230.321 ms"
wlzqhblo

wlzqhblo1#

使用FTS提高分面搜索性能的一种方法是将分面作为数据模型的一部分进行预计算和存储,因为它避免了在每个查询上重复解析和分析FTS索引的需要,但代价是使用更多的存储。缺点是,当产品数据发生变化时,您需要保持facets表是最新的,但这可以通过数据库触发器或批处理来管理。
你要找的布局是这样的-

-- create table
CREATE TABLE product_facets (
    id serial primary key,
    attr text,
    value text,
    count integer
);

-- populate based on fts index
INSERT INTO product_facets (attr, value, count)
SELECT 
    split_part(word, ':', 1) AS attr,
    split_part(word, ':', 2) AS value,
    ndoc AS count
FROM ts_stat($$ SELECT tsvagg FROM product $$)
ORDER BY word;

相关问题