如何通过postgres中的匹配数量获得最佳匹配产品

时间:2016-09-29 19:25:16

标签: postgresql search full-text-search postgresql-9.1 tsvector

Postgres 9.1购物车包含产品表

create table products (
  id char(30) primary key,
  name char(50),
  description text );

购物车有搜索字段。如果输入了某些内容,则自动完成下拉列表必须显示按照此条件匹配的数量产品订购的最佳匹配产品。

如何在postgres 9.1中实现这样的查询?搜索应按产品表中的名称和说明字段执行。 使用子串匹配就足够了。不严格要求使用复杂的文本匹配进行全文搜索。

更新

Word joote可以是产品名称或说明的一部分。

例如,图像文本中的第一个匹配项可能包含

.. See on jootetina ..

和其他产品

Kasutatakse jootetina tegemiseks ..

和另一个大写

Jootetina on see ..

在这种情况下,查询应返回单词jootetina并匹配计数3。 如何在Google Chrome地址栏中键入搜索字词时使其像auotcomplete一样工作?

如何实现这个?

或者如果这很困难,如何返回单词jootetina形成所有匹配搜索词joote的文本?

2 个答案:

答案 0 :(得分:1)

select word, count(distinct id) as total
from (
    select id,
        regexp_split_to_table(name || ' ' || description, E'\\s+') as word
    from products
) s
where position(lower('joote') in lower(word)) > 0
group by word
order by 2 desc, 1

答案 1 :(得分:1)

首先, 使用数据类型char(n)。这是一个误解,你需要varchar(n)text。我建议text

有了这个问题,您需要一种基于智能索引的方法,否则这就是性能噩梦。原始列上的trigram GIN索引或单个单词的物化视图上的text_pattern_ops btree索引(带计数)。

MV方法可能优于单词之间的许多重复。