是否可以在PostgresSQL全文搜索中赋予权重或提高查询条件?
例如,在使用关键字“ vehicle”,“ bus”进行搜索时...会将“ vehicle”排在较高的行中,而将“ bus”排在较低的行。
答案 0 :(得分:0)
您必须使用setweight
上的tsvector
函数为向量的某些元素分配特定的权重:
setweight(to_tsvector('english', '...'), 'A', '{vehicl}')
然后,ts_rank
函数会将出现的vehicle
计数为高。
答案 1 :(得分:0)
另一种可能性是将多个查询等级组合为一个。它涵盖了除每个术语放松/增强功能以外的其他放松技术-请注意我示例中的简单字典。它也可以在PostgreSQL的SaaS版本上使用,在该版本中,您不能随意使用自定义扩展名/字典。
内置排名功能仅是示例。您可以编写自己的排名函数和/或将其结果与其他因素结合起来以满足您的特定需求。
CREATE TABLE animal
(
name text
);
insert into animal
values ('cat-dog'),
('cat dog'),
('dog-cat'),
('dog cat'),
('cats and dogs'),
('dogs and cats'),
('cat'),
('dog');
create index animal_fulltext_idx on animal using gist (to_tsvector('english', coalesce(name, '')));
SELECT name,
to_tsvector('english', coalesce(name, '')) @@ to_tsquery('english', 'cats & dogs') as original_query_matches,
ts_rank(to_tsvector('english', coalesce(name, '')), to_tsquery('english', 'cats & dogs')) as original_query_rank,
to_tsvector('simple', coalesce(name, '')) @@ to_tsquery('simple', 'cats & dogs') as strict_query_matches,
ts_rank(to_tsvector('simple', coalesce(name, '')), to_tsquery('simple', 'cats & dogs')) * 1.05 as strict_query_rank,
to_tsvector('simple', coalesce(name, '')) @@ to_tsquery('simple', 'cats <2> dogs') as extra_strict_query_matches,
ts_rank(to_tsvector('simple', coalesce(name, '')), to_tsquery('simple', 'cats <2> dogs')) * 1.15 as extra_strict_query_rank,
to_tsvector('english', coalesce(name, '')) @@ to_tsquery('english', 'cats | dogs') as relaxed_query_matches,
ts_rank(to_tsvector('english', coalesce(name, '')), to_tsquery('english', 'cats | dogs')) * 0.95 as relaxed_query_rank,
greatest(
CASE
WHEN to_tsvector('english', coalesce(name, '')) @@ to_tsquery('english', 'cats & dogs')
THEN ts_rank(to_tsvector('english', coalesce(name, '')), to_tsquery('english', 'cats & dogs'))
ELSE 0 END,
CASE
WHEN to_tsvector('simple', coalesce(name, '')) @@ to_tsquery('simple', 'cats & dogs')
THEN ts_rank(to_tsvector('simple', coalesce(name, '')), to_tsquery('simple', 'cats & dogs')) * 1.05
ELSE 0 END,
CASE
WHEN to_tsvector('simple', coalesce(name, '')) @@ to_tsquery('simple', 'cats <2> dogs')
THEN ts_rank(to_tsvector('simple', coalesce(name, '')), to_tsquery('simple', 'cats <2> dogs')) * 1.15
ELSE 0 END,
CASE
WHEN to_tsvector('english', coalesce(name, '')) @@ to_tsquery('english', 'cats | dogs')
THEN ts_rank(to_tsvector('english', coalesce(name, '')), to_tsquery('english', 'cats | dogs')) * 0.95
ELSE 0 END
) as greatest_rank
FROM animal
where to_tsvector('english', coalesce(name, '')) @@ (to_tsquery('english', 'cats & dogs') || to_tsquery('english', 'cats <-> dogs') || to_tsquery('english', 'cats | dogs'))
order by greatest_rank desc;
在PostgreSQL 12.2上测试
(如果有人知道如何通过更简单/更快的查询来达到相同的结果,我会 很想听听。)