gpt4 book ai didi

bool 模式下的 MySQL FullText : searching keywords that contain '+' as part of the string

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

我已经看过十几个“类似”的问题,但运气不佳。我明白 + 在 BOOLEAN 模式下附加到 FULLTEXT 中的关键字具有特殊含义,但是,如果我们的关键字实际上包含 + 符号作为文本/字符串的后缀部分怎么办。我们怎样才能仍然使用全文搜索并获得正确的结果?

数据库结构

CREATE TABLE `ft_test` (
`i_id` int(11) NOT NULL,
`i_desc` mediumtext NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

ALTER TABLE `ft_test`
ADD PRIMARY KEY (`i_id`) USING BTREE;
ALTER TABLE `ft_test` ADD FULLTEXT KEY `i_desc` (`i_desc`);

ALTER TABLE `ft_test`
MODIFY `i_id` int(11) NOT NULL AUTO_INCREMENT;
COMMIT;

数据库数据

SELECT * FROM ft_test;
+------+-----------+
| i_id | i_desc |
+------+-----------+
| 1 | test |
| 2 | test+ |
| 3 | test++ |
| 4 | test + |
| 5 | test plus |
+------+-----------+

测试 #1:喜欢查询

SELECT * FROM ft_test WHERE i_desc LIKE 'test+%';
+------+--------+
| i_id | i_desc |
+------+--------+
| 2 | test+ |
| 3 | test++ |
+------+--------+

测试 #2:全文查询

SELECT *, MATCH(`i_desc`) AGAINST ('"test+"' IN BOOLEAN MODE) AS RELEVANCE
-> FROM `ft_test`
-> WHERE MATCH(`i_desc`) AGAINST ('"test+"' IN BOOLEAN MODE)
-> ORDER BY RELEVANCE;

+------+-----------+-----------+
| i_id | i_desc | RELEVANCE |
+------+-----------+-----------+
| 1 | test | 1 |
| 2 | test+ | 1 |
| 3 | test++ | 1 |
| 4 | test + | 1 |
| 5 | test plus | 1 |
+------+-----------+-----------+

如您所见,在这种情况下,LIKE 查询实际上返回了更好的排序结果。我也尝试过使用引号进行完全匹配,结果相同。添加像“test\+”这样的“特殊”字符也无济于事。虽然 FT 结果并非毫无用处,但还不够完美,因为顺序不是我期望的那样。

问题

是否真的有可能实现这一点并返回与使用 FULLTEXT 模式的 LIKE 相同的结果?如果是,如何?

谢谢!

最佳答案

如果您将列定义为使用将字符视为普通字母而非标点符号的排序规则,则只能索引标点符号。

有一个手册页显示了执行此操作的步骤:https://dev.mysql.com/doc/refman/8.0/en/full-text-adding-collation.html

但是既然你说你的脚本是硬编码的,我想你没有权限为你正在搜索的列重新定义排序规则,或者在安装自定义排序规则定义后重新启动 MySQL 服务器。

解决方法是搜索不带标点符号的单词,然后在找到匹配单词后添加要应用的条件。

SELECT *, MATCH(`i_desc`) AGAINST ('"test"' IN BOOLEAN MODE) AS RELEVANCE
FROM `ft_test`
WHERE MATCH(`i_desc`) AGAINST ('"test"' IN BOOLEAN MODE)
AND i_desc LIKE 'test+%';
ORDER BY RELEVANCE;

它将使用全文索引来查找与该词匹配的行,然后另一个条件项将针对那些具有带 + 的字符串的行(希望是小的)行进行过滤> 包括在内。

但同样,如果您无权更改 SQL 查询,这就没有意义了。

关于 bool 模式下的 MySQL FullText : searching keywords that contain '+' as part of the string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54818233/

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