繁体   English   中英

PostgreSQL 全文搜索权重/搜索词的优先级

[英]PostgreSQL full text search weight/priority on searchterms

我在 PostgreSQL 到 Django 中使用全文搜索。

我想将权重与搜索词相关联。 我知道可以将不同的权重与不同的字段相关联,但我希望对搜索词具有不同的权重。

例子:

from core.models import SkillName
vector = SearchVector(
    "name",
)
search = SearchQuery("Java") | SearchQuery("Spring")
search_result = (
    SkillName.objects.all()
        .annotate(search=vector)
        .filter(search=search)
        .annotate(rank=SearchRank(vector, search))
        .order_by("-rank")
)
for s in search_result.distinct():
    print(f"{s} rank: {s.rank}")

现在我希望“Java”比“Spring”更重要并获得相应的排名。 我想我可以进行 2 次不同的搜索并将排名乘以因子,但有更好的方法吗?

想要将不同的优先级与搜索词相关联真的很奇怪吗?

生成的 SQL 供参考,老实说,我现在不认为这在 Django 中是可能的,我们可能需要 PostgreSQL 专家的帮助。

SELECT DISTINCT "core_skillname"."id",
                "core_skillname"."name",
                to_tsvector(COALESCE("core_skillname"."name", '')) AS "search",
                ts_rank(to_tsvector(COALESCE("core_skillname"."name", '')), (plainto_tsquery('Java') || plainto_tsquery('Spring'))) AS "rank"
FROM "core_skillname"
WHERE to_tsvector(COALESCE("core_skillname"."name", '')) @@ (plainto_tsquery('Java') || plainto_tsquery('Spring'))
ORDER BY "rank" DESC;```

应用带有权重的等级不需要两个查询,只需要在同一个查询中使用两个子表达式。

SELECT DISTINCT "core_skillname"."id",
                "core_skillname"."name",
                to_tsvector(COALESCE("core_skillname"."name", '')) AS "search",
                ts_rank(to_tsvector(COALESCE("core_skillname"."name", '')), plainto_tsquery('Spring')) +
                ts_rank(to_tsvector(COALESCE("core_skillname"."name", '')), plainto_tsquery('Java')) * 1.5 AS "rank"
FROM "core_skillname"
WHERE to_tsvector(COALESCE("core_skillname"."name", '')) @@ (plainto_tsquery('Java') || plainto_tsquery('Spring'))
ORDER BY "rank" DESC;

既然这样很容易挠自己的痒,为什么要发明其他机制来做到这一点呢? 当权重是表的一部分,而不是查询的一部分时,你不能真正这样做,所以它自己的机制更有意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM