Postgresql 按精确匹配排序全文搜索,然后按前缀匹配排序

Postgresql 按精确匹配排序全文搜索,然后按前缀匹配排序,postgresql,full-text-search,Postgresql,Full Text Search,如何确保全文搜索结果按精确匹配排序,然后按前缀匹配排序 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

如何确保全文搜索结果按精确匹配排序,然后按前缀匹配排序

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
我尝试了一些建议,比如
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 | ??

使用
类似
类似

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)    

这很有趣。如果我们用
ticker
而不是
name
进行排序,这似乎是可行的,但它似乎也有点黑客行为,因为它跳过了postgresql全文搜索的排名功能。似乎在更大的数据集上使用全文搜索排名会更有效。你有什么理由建议使用这种方法而不是使用全文搜索机制的方法吗?首先,你无法仅通过全文搜索找到这样的精确匹配。像一样使用
并不是全文搜索,而是在全文搜索旁边。这两个特性可以很好地协同工作。当然,像
这样的在大数据集上的成本会更高,但我看不到其他方法来实现您想要的。这是有意义的。我们现在正在使用一些标准化权重,并看到了非常好的结果,但我认为我们最终将得到您的解决方案和这些解决方案的一些组合。