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/or
LIKE` 不适用。)
如果您将最小字长设置为 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
没有这样的。
请建立一个你想要匹配/不匹配的列表。我们可能会为您提供更好的答案。
例如,在数据库中我有包含短语 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/or
LIKE` 不适用。)
如果您将最小字长设置为 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
没有这样的。
请建立一个你想要匹配/不匹配的列表。我们可能会为您提供更好的答案。