【发布时间】:2019-02-22 00:23:12
【问题描述】:
我已经看了十几个“类似”的问题,但没有运气。我了解+在BOOLEAN模式下附加到FULLTEXT中的关键字有特殊含义,
但是,如果我们的关键字实际上包含 + 符号作为文本/字符串的后缀部分怎么办。我们怎样才能仍然使用 FULL-TEXT 搜索并获得正确的结果?
数据库结构
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 相同的结果吗?如果是,怎么做?
谢谢!
【问题讨论】:
-
如果不需要运算符,为什么要使用布尔模式?
-
它是脚本的一部分,硬编码。
-
我不确定 + 是否被视为单词的一部分。我猜它是一个单词分隔符,因此被排除在全文索引之外并在搜索中被忽略。
标签: mysql sql full-text-search mariadb