MySQL全文搜索结果相关性

Posted

技术标签:

【中文标题】MySQL全文搜索结果相关性【英文标题】:MySQL Fulltext search result relevance 【发布时间】:2014-02-18 07:51:45 【问题描述】:

我有以下“银行”表

ID  | name

1   | JPMorgan Chase bank  
2   | Bank of south  
3   | Citigroup bank 
4   | Wells Fargo bank
5   | Bank of New York 

所以当搜索“bank of”时,我希望搜索结果返回如下:

Bank of New York
Bank of south
Citigroup bank
JPMorgan Chase bank
Wells Fargo bank

但是下面的代码返回:

JPMorgan Chase bank
Bank of America
Citigroup bank
Wells Fargo bank
Bank of New York 

这是代码:

$search_term = 'bank of';

$sql2 = "SELECT *, 
         MATCH(name) AGAINST ('.$search_term.' IN BOOLEAN MODE)
         AS relevance FROM banks
         HAVING relevance > 0.8 
         ORDER BY relevance DESC";  

谢谢!

【问题讨论】:

考虑一下:出现在 50% 或更多行中的单词被认为是常见的并且不匹配。 @juergend,对,但我的选择是什么? 两个字符的单词,例如'of',不会被 mysql 全文索引索引,因为最小单词长度在 InnoDB 表中限制为 3 个字符,在 MyISAM 表中限制为 4 个字符。在这里阅读更多。在您有权将最小字长更改为 2 个字符的情况下,应该会给您预期的结果。 【参考方案1】:

...对,但我的选择是什么?

你可以试试这样的

SELECT *, 
       MATCH(name) AGAINST ('bank of' IN BOOLEAN MODE) AS relevance,
       name LIKE '%bank of%' AS full_match
  FROM banks
HAVING relevance > 0.8 
 ORDER BY full_match DESC, relevance DESC, name

结果:

|身份证 |姓名 |相关性 |完整匹配 | |----|----------|------------|---------- --| | 5 |纽约银行| 1 | 1 | | 2 |南方银行| 1 | 1 | | 3 |花旗银行| 1 | 0 | | 1 |摩根大通银行 | 1 | 0 | | 4 |富国银行 | 1 | 0 |

这里是SQLFiddle演示

【讨论】:

以上是关于MySQL全文搜索结果相关性的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 全文搜索以布尔模式按相关性排序

Mysql全文搜索跨多个表的相关性

如何按相关性对MYSQL全文搜索结果进行排序

如何操纵 MySQL 全文搜索相关性以使一个字段比另一个字段更“有价值”?

全文搜索之MySQL与ElasticSearch搜索引擎

es深入搜索之全文检索