簡體   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