多标签搜索,后端一般是怎样实现的?不会是多表直接 join 吧?

查看 26|回复 0
作者:yodhcn   
提到多对多关系,第一个反应是 3 张表 —— 即,两张数据表、一张关系表,例如:
t_product
| id (integer) | name (character verying) |
t_tag
| id (integer) | name (character verying) |
r_product_tag
| product_id (integer) | tag_id (integer) |
但需要根据多个 tag 查询 product 时(/product?tags=苹果,橘子),只用数据库该怎样实现?
  • 直接将 3 张表 JOIN 在一起?感觉查询效率会很低。
  • 建立倒排索引?例如,将表 t_product 新增一冗余列 tags (character verying),并在该列上建立 PostgreSQLGIN 索引。这种方式顺便还可以通过分词单个标签的字符串拆分成多个关键字,更容易搜索。

    t_product
    | id (integer) | name (character verying) | tags (character verying) |
    如果只按标签的 id 查询(/product?tag_ids=22,12,45),表 t_product 新增一冗余列 tag_ids (integer[]),这种情况该在此列上建立 B+树索引 还是 倒排索引?
    t_product
    | id (integer) | name (character verying) | tag_ids (integer[]) |
    不知道 PostgreSQL 对 integer[] 类型字段的索引机制是怎样的?
  • 您需要登录后才可以回帖 登录 | 立即注册

    返回顶部