MySql `MATCH AGAINST` 和 `LIKE` 组合搜索特殊字符

MySql `MATCH AGAINST` and `LIKE` combination to search for special characters

例如,在数据库中我有包含短语 DN-NP 的行。 在输入字段中,我键入 DN- 并希望找到该行。 这是示例 http://sqlfiddle.com/#!9/f9235a/4 尝试使用 FULLTEXT 索引和 MATCH AGAINST

SELECT `name` 
FROM `domains` 
WHERE MATCH (`name`) AGAINST ('DN*' IN BOOLEAN MODE);

没有结果。

这里https://dba.stackexchange.com/a/111895/55397是建议结合LIKE。目前的想法是 php 类似

if( strlen($_POST['input_field_value']) <= 2 ){ 
$sql = 'SELECT `name` 
FROM `domains` 
WHERE MATCH (`name`) AGAINST ('DN*' IN BOOLEAN MODE)
OR `name` LIKE "%DN%"'; 
}

但是 LIKE "% %" 太慢了?任何解决问题的想法(找到包含特殊字符的短语)?

LOCATE(性能)怎么样?

SELECT name AS name7 
FROM domains 
WHERE LOCATE('DN',`name`)>0;

正则表达式怎么样?

SELECT 名称 AS 名称 6 来自域 WHERE name 正则表达式 ('DN');

索引可以通过限制要查看的行数来帮助提高速度。目前显示的大多数代码都需要测试每一行。

  • FULLTEXT 在其规则应用 时非常擅长查找行。由于字长和标点符号的存在,我怀疑 +DN* 是否适用。
  • `LIKE "DN-NP%" 可以非常有效地使用索引。但这仅适用于列开头的字符串。
  • `LIKE "%DN-NP%" -- 前导通配符需要检查每一行。
  • LOCATE 和任何其他字符串运算符——不可搜索,因此需要查看每一行。
  • REGEXP "DN-NP" -- slower than LIKE. (There are other situations where REGEXPcan be faster and/orLIKE` 不适用。)

如果您将最小字长设置为 2,那么这个技巧可能是最有效的:

WHERE MATCH(col) AGAINST("+DN +NP" IN BOOLEAN MODE)
  AND col LIKE '%DN-NP%'

MATCH 将有效减少行数; LIKE 将进一步减少数字或行数,但只查看 MATCH.

中的小数字

警告:您需要匹配或不匹配哪些?:

abc DN-NP def
abc DNs-NPed def   -- look likes "plural", etc which FULLTEXT matches
abc DN-NPQRS def   -- word boundary issue
abc ZYXDN-NP def

REGEXP 可以匹配一个“单词边界”; LIKE没有这样的。

请建立一个你想要匹配/不匹配的列表。我们可能会为您提供更好的答案。