【发布时间】:2020-08-18 12:23:17
【问题描述】:
所以我有一张places 的表格。每个地方可以有多个posts。每个帖子可以有多个tags。每个post 和tag 都通过tags_map 表连接。所以:
places
id
posts
place_id
tags
id
name
tags_map
post_id
tag_id
我正在尝试编写一个排名/搜索查询,例如如果有人搜索标签a 和b,那么他们将获得所有标记为a 和b 的地点的结果,然后是标记为a 或b 的地点。
如果一个地方有 2 个与之关联的帖子,则它具有所有这些帖子的标签。我正在寻找部分匹配 - 我一直在尝试使用 SIMILAR TO %(a|b)% 但这只是给了我 OR 结果。
排名应该如下:
如果一个地方有两个标签,它的排名高于有一个或的地方。如果它们同时具有两个标签,则总匹配标签较多的标签排名高于匹配标签较少的标签。并且在查询的 OR 部分,它们是按照哪个地方有更多匹配的标签来排名的。
我无法理解所需的必要 JOINS 以及如何聚合 AND 结果并确定其优先级,然后是 OR 结果
这可行吗?
编辑:示例
Places: a, b, c
Posts: a1, a2, b1, b2, c1
Tags:
* a1_wand, a1_ball
* a1_wander
* b1_baller
* b2_wand
* c1_kaballer, c1_bababall
如果您搜索wand 和ball,您首先会得到与球和魔杖部分匹配的那些,因此请放置a 和b,因为a 有更多匹配项(2 代表wand 和 1 用于球)它会在 b 之前订购(其中 1 用于球,1 用于魔杖)。而c 只匹配一个查询词(两次,但仍然只是其中一个词),所以接下来是。
如果您只搜索ball,那么您将首先发布c,因为它有2 个匹配项,然后a 和b 都有一个匹配项,因此它们只会在created_at 中排序日期什么的。
【问题讨论】:
标签: sql postgresql