【问题标题】:How to get best matching products by number of matches in postgres如何通过postgres中的匹配数获得最佳匹配产品
【发布时间】:2017-02-08 06:14:12
【问题描述】:

Postgres 9.1 购物车包含产品表

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

购物车有搜索栏。如果在其中输入了某些内容,自动完成下拉菜单必须显示按符合此条件的产品数量排序的最佳匹配产品。

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

更新

单词 joote 可以是产品名称或描述的一部分。

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

.. See on jootetina ..

对于其他产品

Kasutatakse jootetina tegemiseks ..

还有一个大写

Jootetina on see ..

在这种情况下,查询应该返回单词 jootetina 和匹配计数 3。 如何让它像在谷歌浏览器地址栏中输入搜索词时发生的自动完成一样工作?

如何实现?

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

【问题讨论】:

  • 如果名称和描述都匹配怎么办?它会算作 2 还是仅算 1?
  • 列表显示产品数量。如果这是同一个产品,它应该只计算一个

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


【解决方案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

【讨论】:

  • 此查询不返回文本中的匹配词。如何让它更像真正的搜索,比如在 chrome 工具栏中输入内容时自动完成?我更新了问题并提供了示例。
【解决方案2】:

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

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

对于单词之间的多次重复,MV 方法可能更胜一筹。

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多