[英]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.