2016-12-16 106 views
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 

可惜這種情況提供了不是我想要的順序,因爲它的分數多個相同的命中精確比命中獨特的更好。是否可以編寫這樣的自定義排名函數?

回答

0

我不能肯定,如果我理解你的問題,
可以使用一些基本的SQL關鍵字,並以這種方式聚集funtion簡化查詢:

SELECT 
    b.title, 
    sum(case when to_tsvector('english' , title) @@ to_tsquery(a.keyword) 
      then a.score end) AS score 
    FROM book b 
    cross join ( 
    values 
    ('kate:*', 1), 
    ('kate', 0.5), 
    ('mat:*', 1), 
    ('mat', 0.5) 
) as a(keyword, score) 
group by b.title 
ORDER BY score DESC; 

您還必須適應這個查詢對於每個新的搜索詞,但現在看起來更容易一些。

+0

那更緊湊好吧,不知道加入的值。我的目標是擁有一個功能,可以採用像'凱特墊...'這樣的搜索術語,並且只是通過優先考慮獨特和精確的命中來計算順序。 – SlideM