2016-09-29 22 views
0

的Postgres 9.1的购物车中包含的产品表如何通过匹配的数量以获得最佳匹配的产品的Postgres

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

车有搜索栏。如果输入内容,自动完成下拉菜单必须显示与此条件匹配的数字产品排序的最匹配产品。

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

更新

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

例如,对于在图像文本第一匹配可能包含

​​

和用于其它产品

Kasutatakse jootetina tegemiseks .. 

和另一个与上壳体

Jootetina on see .. 

在这种情况下查询应返回字jootetina和匹配计数3. 如何使它工作像在Google Chrome地址栏中输入搜索字词时发生的自动完成功能?

如何实现这个?

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

+0

如果它与名称和描述相匹配,该怎么办?它会计为2还是只有一个? –

+0

列表显示产品数量。如果这是同一产品,则应只计算一个 – Andrus

回答

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 
+0

此查询不会返回文本中的匹配词。如何使它更像真正的搜索工作,就像在铬工具栏中键入内容时自动填充一样?我更新了问题并提供了示例。 – Andrus

+0

http://stackoverflow.com/questions/39790930/how-to-get-best-matching-words-from-name-and-description有相关问题 – Andrus

0

首先,做使用的数据类型char(n)。这是一个误解,你想varchar(n)或只是text。我建议text

随着那固定的,你需要一个智能的基于指数的方法或者这是一个性能噩梦。在原始列上的三元组GIN索引或单个词的物化视图上的btree索引(包括计数)。

的MV的方法可能是对词语间的重复优越。

相关问题