gpt4 book ai didi

mysql - 如何在 InnoDB 全文索引上获得部分匹配的单词搜索的不同分数?

转载 作者:行者123 更新时间:2023-11-29 05:57:17 24 4
gpt4 key购买 nike

我在带有 InnoDB 全文索引的 MySQL 5.6 中得到了下表。

CREATE TABLE `blacklist_entries` (
`blacklist_entry_id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`insertat` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`blacklist_entry_id`),
FULLTEXT KEY `ftk_b_n` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=660004 DEFAULT CHARSET=utf8

这是我们正在处理的数据。 name 中的所有条目都是单个单词,有时带有 -,但绝不会超过一个单词。

mysql> select * from blacklist_entries where name like '%battle%';
+--------------------+---------------------+---------------------+
| blacklist_entry_id | name | insertat |
+--------------------+---------------------+---------------------+
| 4159 | battleground | 2018-01-16 12:15:46 |
| 604218 | battle | 2018-01-16 12:18:59 |
| 604219 | battlefield | 2018-01-16 12:18:59 |
| 604220 | battlefields | 2018-01-16 12:18:59 |
| 604221 | battles | 2018-01-16 12:18:59 |
| 660003 | abcbattle | 2018-01-16 12:49:34 |
+--------------------+---------------------+---------------------+

我想创建一个能够按相关性排序的全文搜索列表,其中完全匹配的分数高于部分匹配。

当我运行这个查询时

select
*,match(name) against ('battle battle* *battle' IN BOOLEAN MODE) as score
from blacklist_entries where match(name)
against ('battle battle* *battle' IN BOOLEAN MODE);

我得到以下结果。

+--------+---------------------+---------------------+--------------------+
| id | name | insertat | score |
+--------+---------------------+---------------------+--------------------+
| 4159 | battleground | 2018-01-16 12:15:46 | 17.11724281311035 |
| 604218 | battle | 2018-01-16 12:18:59 | 17.11724281311035 |
| 604219 | battlefield | 2018-01-16 12:18:59 | 17.11724281311035 |
| 604220 | battlefields | 2018-01-16 12:18:59 | 17.11724281311035 |
| 604221 | battles | 2018-01-16 12:18:59 | 17.11724281311035 |
+--------+---------------------+---------------------+--------------------+

这有两个问题。

  • 所有结果得分相同,甚至完全匹配
  • 右边不匹配,少了这一行

    | 660003 | abcbattle           | 2018-01-16 12:49:34 |  17.11724281311035 |

我可以更改查询中的某些内容以说服 MySQL 对这些匹配进行不同的评分吗?

如果这不可能,是否有可行的替代方案,例如在存储过程中实现我自己的评分,并再次迭代完整列表以至少识别完全匹配以将其排名更高?

如果这些都不起作用,我将不得不在我的应用程序层中完全构建评分。显然,这会花费额外的资源,所以我想避免这种情况。

最佳答案

https://dev.mysql.com/doc/refman/5.6/en/fulltext-boolean.html

分数是单词出现的时间量,因此对于所有单词出现一次并将结果平分。

关于mysql - 如何在 InnoDB 全文索引上获得部分匹配的单词搜索的不同分数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48284399/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com