Mysql与排名匹配

时间:2017-05-04 13:27:43

标签: mysql search match against

我目前正在使用类似的自动填充框查询。但是我想使用匹配,对应的速度应该更快,但我正在解决排序的一些问题。

我想对这样的查询进行排名:

  1. [query]%
  2. [query]%
  3. %[query]%
  4. %[查询]%
  5. 现在我用

    SELECT * FROM table 
    WHERE name LIKE '%query%'
    ORDER BY (case 
    WHEN name LIKE 'query %' THEN 1 
    WHEN name LIKE 'query%' THEN 2 
    WHEN name LIKE '% query%' THEN 3 
    ELSE 4 END) ASC
    

    当我使用...

    SELECT * FROM table 
    WHERE MATCH(name) AGAINST('query*' IN BOOLEAN MODE)
    

    ...所有结果都获得相同的'排名得分'。

    例如搜索Natio 返回Pilanesberg National ParkNational Park Kruger时得分相同,而我希望第二个结果为第一个因为启动并带有查询。

    我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

我有同样的问题,我不得不以不同的方式处理它。

MySQL的documentation说:

  

术语频率(TF)值是单词在文档中出现的次数。使用以下公式计算单词的逆文档频率(IDF)值,其中total_records是集合中的记录数,matching_records是搜索项出现的记录数。

     

$ {IDF} = log10($ {total_records} / $ {matching_records})

     

当文档多次包含单词时,IDF值乘以TF值:

     

$ {TF} * $ {IDF}

     

使用TF和IDF值,使用以下公式计算文档的相关性排名:

     

$ {rank} = $ {TF} * $ {IDF} * $ {IDF}

接下来是一个例子,它解释了上述声明:它在不同的字段中搜索“数据库”一词,并根据结果返回一个等级。

在你的例子中,“匹兰斯堡国家公园”,“国家公园克鲁格”将对('Natio '在BOOLEAN模式中)*返回相同的等级,因为等级不是基于<这个词的常识 相似性(或者在这种情况下,你希望告诉数据库什么是 - 为你 - “,类似于”) ,但是基于以上公式,与频率有关。

另请注意,频率的值受索引类型(InnoDB或MyISAM)和MySQL版本的影响(在旧版本中,您不能使用InnoDB表的全文索引)。

关于您的问题,您可以使用MySQL user defined variablesfunctions or procedures来根据您的排名来评估排名。示例hereherehere。还有here

另见:

MySQL match() against() - order by relevance and column?

MYsql FULLTEXT query yields unexpected ranking; why?