1
排名多個唯一值我正在調整我的文字搜索查詢,以獲得給定的搜索條件最好的結果。我正在尋找的是一種排名功能,它只會提高搜索字段中新的唯一值的分數。它也應該比僅僅前綴命中得分更精確。我用龐大的查詢能夠達到預期的結果,但想知道是否可以使用rank函數實現更優雅的類似結果。我給你舉個例子:功能在PostgreSQL中
CREATE TABLE book (
id BIGSERIAL NOT NULL PRIMARY KEY,
title VARCHAR(255) NOT NULL
);
INSERT INTO book (title) VALUES ('Kate Mat');
INSERT INTO book (title) VALUES ('Kate Kate Mate');
INSERT INTO book (title) VALUES ('Cat Mat');
這是我與搜索項「凱特」 +「墊」笨重查詢:
SELECT
title,
a1 + a2 + b1 + b2 AS score
FROM (
SELECT
title,
CASE WHEN to_tsvector('english', title) @@ to_tsquery('kate:*')
THEN 1
ELSE 0
END AS a1,
CASE WHEN to_tsvector('english', title) @@ to_tsquery('kate')
THEN 0.5
ELSE 0
END AS a2,
CASE WHEN to_tsvector('english', title) @@ to_tsquery('mat:*')
THEN 1
ELSE 0
END AS b1,
CASE WHEN to_tsvector('english', title) @@ to_tsquery('mat')
THEN 0.5
ELSE 0
END AS b2
FROM book
) scoredProducts
ORDER BY score DESC;
#----------------------results-------------------------
title score
Kate Mat 3 -- exact hit for both terms
Kate Kate Mate 2.5 -- exact hit for 'Kate'. prefix hit for 'Mat'
Cat Mat 1.5 -- exact hit for 'Mat'
這實際上是爲了結果我想看到的。查詢的顯而易見的問題是我需要爲每個額外的搜索詞進行調整。我想一個語法更多的東西是這樣的:
SELECT
title,
ts_rank(to_tsvector('english', book.title), to_tsquery('kate:* | mat:*')) AS score
FROM book
ORDER BY score DESC;
#----------------------results-------------------------
title score
Kate Kate Mate 0.0683918 -- prefix hits for both terms
Kate Mat 0.06079271 -- exact hit gets scored less
Cat Mat 0.030396355
可惜這種情況提供了不是我想要的順序,因爲它的分數多個相同的命中精確比命中獨特的更好。是否可以編寫這樣的自定義排名函數?
那更緊湊好吧,不知道加入的值。我的目標是擁有一個功能,可以採用像'凱特墊...'這樣的搜索術語,並且只是通過優先考慮獨特和精確的命中來計算順序。 – SlideM