我目前正在使用类似的自动填充框查询。但是我想使用匹配,对应的速度应该更快,但我正在解决排序的一些问题。
我想对这样的查询进行排名:
现在我用
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 Park
和National Park Kruger
时得分相同,而我希望第二个结果为第一个因为启动并带有查询。
我怎样才能做到这一点?
答案 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 variables或functions or procedures来根据您的排名来评估排名。示例here,here或here。还有here。
另见: