0

我目前正在使用类似的自动完成框查询。但是我想使用匹配,它应该更快,但我遇到了一些排序问题。

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

  1. [询问] %
  2. [询问]%
  3. % [询问]%
  4. %[询问]%

现在我使用

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具有相同的分数,而我希望第二个结果作为第一个结果,因为它以查询开头。

我怎样才能做到这一点?

4

1 回答 1

1

我遇到了同样的问题,我不得不以不同的方式解决它。

MySQL的文档说:

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

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

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

${TF} * ${IDF}

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

${排名} = ${TF} * ${IDF} * ${IDF}

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

在您的示例中,“匹兰斯堡国家公园”、“克鲁格国家公园”这两个词将针对('Natio ' IN BOOLEAN MODE)* 返回相同的排名,因为排名不是基于单词的常识 相似性(或者在这种情况下你希望告诉数据库什么意思——对你来说—— “类似于”),但基于上面的公式,与频率有关。

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

关于您的问题,您可以使用 MySQL用户定义的变量函数或过程,以便根据您对排名的想法来评估排名。示例在这里这里这里。而且也在这里

也可以看看:

MySQL match() against() - 按相关性和列排序?

MYsql FULLTEXT 查询产生意外排名;为什么?

于 2017-09-22T10:56:00.317 回答