2016-09-26 92 views
0

如何確保我的全文搜索結果按精確匹配排序,然後是前綴匹配項?通過完全匹配命令全文搜索然後前綴匹配

SELECT ticker, name, ts_rank(document, to_tsquery('english', 'MAT:*')) AS rank 
FROM (
    SELECT *, setweight(to_tsvector('english', ticker), 'A') || setweight(to_tsvector('english', name), 'B') AS document 
    FROM (VALUES 
    ('MATI-R' , 'MATICHON PCL.NVDR') 
    ,('MATCH-R', 'MATCHING MAXIMIZE SLN. NVDR') 
    ,('MATV' , 'MATAV-CABLE SYS.MEDIA SPN.ADR 1:2 DEAD - DELIST.03/07/06') 
    ,('MAT' , 'MATISSE HOLDINGS DEAD - 03/10/06') 
    ,('MAT' , 'MATTEL') 
) data (ticker,name) 
) ss ORDER BY rank DESC 

我嘗試了一些的建議上https://www.postgresql.org/docs/9.5/static/datatype-textsearch.htmlto_tsquery('english', 'MAT:A & MAT:*B')但沒有似乎給了我,我要找的排序。電流輸出是

ticker |       name       | rank 
---------+----------------------------------------------------------+---------- 
MATI-R | MATICHON PCL.NVDR          | 1.45903 
MATCH-R | MATCHING MAXIMIZE SLN. NVDR        | 1.27665 
MATV | MATAV-CABLE SYS.MEDIA SPN.ADR 1:2 DEAD - DELIST.03/07/06 | 1.09427 
MAT  | MATISSE HOLDINGS DEAD - 03/10/06       | 0.851098 
MAT  | MATTEL             | 0.851098 

時,我想更多的東西一樣

ticker |       name       | rank 
---------+----------------------------------------------------------+---------- 
MAT  | MATTEL             | ?? 
MAT  | MATISSE HOLDINGS DEAD - 03/10/06       | ?? 
MATCH-R | MATCHING MAXIMIZE SLN. NVDR        | ?? 
MATI-R | MATICHON PCL.NVDR          | ?? 
MATV | MATAV-CABLE SYS.MEDIA SPN.ADR 1:2 DEAD - DELIST.03/07/06 | ?? 

回答

2

使用LIKEILIKE

SELECT ticker, name, ts_rank(document, to_tsquery('english', 'MAT:*')) AS rank 
FROM (
    SELECT *, setweight(to_tsvector('english', ticker), 'A') || setweight(to_tsvector('english', name), 'B') AS document 
    FROM (VALUES 
    ('MATI-R' , 'MATICHON PCL.NVDR') 
    ,('MATCH-R', 'MATCHING MAXIMIZE SLN. NVDR') 
    ,('MATV' , 'MATAV-CABLE SYS.MEDIA SPN.ADR 1:2 DEAD - DELIST.03/07/06') 
    ,('MAT' , 'MATISSE HOLDINGS DEAD - 03/10/06') 
    ,('MAT' , 'MATTEL') 
) data (ticker,name) 
) ss ORDER BY name LIKE concat('%', ticker, '%') desc, rank DESC 

ticker |       name       | rank 
---------+----------------------------------------------------------+---------- 
MAT  | MATISSE HOLDINGS DEAD - 03/10/06       | 0.851098 
MAT  | MATTEL             | 0.851098 
MATI-R | MATICHON PCL.NVDR          | 1.45903 
MATCH-R | MATCHING MAXIMIZE SLN. NVDR        | 1.27665 
MATV | MATAV-CABLE SYS.MEDIA SPN.ADR 1:2 DEAD - DELIST.03/07/06 | 1.09427 
(5 rows)  
+0

這很有趣。似乎它工作,如果我們排序'ticker'而不是'name',但它也似乎有點hacky,因爲它跳過postgresql的全文搜索的排名能力。看起來使用全文搜索排名在更大的數據集上會更有效。任何原因你會建議使用全文搜索機器的方法? – Justin

+0

首先,您只能在全文搜索中找不到像這樣的精確匹配。使用「like」不是全文搜索,而是旁邊的。兩個功能都很好地結合在一當然,對於大型數據集,'like'將會更加昂貴,但我不能看到替代方案來實現您想要的。 – klin

+0

有道理。我們現在正在使用一些標準化權重並看到相當不錯的結果,但我認爲我們最終將結合您的解決方案和這些結果。 – Justin