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

标签 python django postgresql full-text-search

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

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

示例:

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;

既然这样很容易让自己痒痒,为什么还要发明其他机制来做到这一点呢?当权重是表的一部分而不是查询的一部分时,您实际上无法这样做,因此它自己的机制更有意义。

关于python - PostgreSQL 全文搜索搜索词的权重/优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67409591/

相关文章:

django - for循环django中的多模式 Bootstrap

javascript - 未捕获的类型错误 : Cannot read property 'split' of undefined(anonymous function)

django - 在Django/Apache中的性能不佳

python - 列出所有 Pipenv 环境

Django:将请求直接(内联)传递到第二个 View

sql - 以编程方式获取用户拥有的数据库的所有表

sql - 在 Postgresql 9.6.5 上使用 ltree 查询时出现语法错误

Python OSX $ which Python gives/Library/Frameworks/Python.framework/Versions/2.7/bin/python

Python 贝叶斯信念网络分类器

python - 启动pypi-server时出现"malformed htpasswd file"错误消息