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.html像to_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 | ??
這很有趣。似乎它工作,如果我們排序'ticker'而不是'name',但它也似乎有點hacky,因爲它跳過postgresql的全文搜索的排名能力。看起來使用全文搜索排名在更大的數據集上會更有效。任何原因你會建議使用全文搜索機器的方法? – Justin
首先,您只能在全文搜索中找不到像這樣的精確匹配。使用「like」不是全文搜索,而是旁邊的。兩個功能都很好地結合在一當然,對於大型數據集,'like'將會更加昂貴,但我不能看到替代方案來實現您想要的。 – klin
有道理。我們現在正在使用一些標準化權重並看到相當不錯的結果,但我認爲我們最終將結合您的解決方案和這些結果。 – Justin