如何搜索文本?(MySQL)

如何搜索文本?(MySQL),mysql,sql,search,Mysql,Sql,Search,我有这张桌子: bussId | nameEn | keywords 500 name1 name2 keyword1 keyword2 如果用户搜索(关键字1或关键字2或名称2或名称1),我想返回bussId 5000。 所以我应该使用这个查询SELECT*FROM business WHERE nameEn,比如“%searched\u word%”。 但根据“如果LIKE的参数是一个不以通配符开

我有这张桌子:

bussId    |      nameEn        |          keywords
  500          name1 name2             keyword1 keyword2
如果用户搜索(关键字1或关键字2或名称2或名称1),我想返回bussId 5000。
所以我应该使用这个查询
SELECT*FROM business WHERE nameEn,比如“%searched\u word%”
。 但根据“如果
LIKE
的参数是一个不以通配符开头的常量字符串,则索引也可用于LIKE比较”,此查询不使用
索引名称或关键字

我有这个解决方案,我想创建另一个表并插入所有单字:

bussId |  word
  500        name1
  500        name2
  500        keyword1
  500        keyword2
然后,我将使用以下查询搜索bussId:
选择*WHERE单词,如“searched\u word%”。

通过这种方式,我将确保MySQL将使用索引,而且速度会更快,但是这个表将包含大约2000万行


还有其他解决方案吗?

从MySQL 5.6开始,您必须使用MyISAM或InnoDB的全文索引:

mysql> ALTER TABLE business ADD FULLTEXT(nameEn, keywords);
这是你的要求:

mysql> SELECT * FROM business
   -> WHERE MATCH (nameEn, keywords) AGAINST ('searched_word');
您是否尝试过Instr()或Locate()函数?下面是一个比较它们和Like的例子,但是比较前面的%通配符可能会更好。它仍然运行完整的表扫描,但不知道MySQL查询优化器如何使用字符串函数索引

SELECT * FROM business WHERE Instr(nameEN, 'search_word') > 0 


此外,可能还有其他优化领域。查看
business
表中是否有其他潜在索引可用,如果没有使用所有列,则显式声明特定列而不是星号(*),并按空格解析
nameEN
关键字
列,以便列保留一个值(有可能转置),然后使用隐式连接,
WHERE
,或显式连接,
join
。这甚至可能是一个表设计问题,需要在一个字段中存储多个值。

使用新版本的MySQL,您不需要将引擎设置为“MyISAM”,InnoDB也支持全文索引(我已经测试了5.6.15,支持表单版本>=5.6.4)。 因此,如果您的服务器版本高于5.6.4,则只需将全文索引添加到表中,并使用匹配(…)对(…)进行选择,示例如下

CREATE FULLTEXT INDEX idx ON business (nameEn);

SELECT * FROM business 
WHERE match(nameEn)against('+searched_word' IN BOOLEAN MODE);

在MySQL或SQL中使用以下语句,它将返回完美的结果:

SELECT * FROM business WHERE (nameEn LIKE 'searched_word%' OR nameEn LIKE '%searched_word%') OR (keywords LIKE 'searched_word%' OR keywords LIKE '%searched_word%') AND bussID = 500;  

这应该是可行的。

2000万条记录相当多,带有varchar列的映射表将为每行分配最大允许字符数(以字节为单位)以及为整数列分配32位

如果您可以创建一个类似(id int,crc int)的表,并只存储文本数据的crc32值,该怎么办。它区分大小写,因此在填充数据时需要转换为大写/小写,在比较时需要转换为大写/小写

我同意全文方法,但为了节省空间和利用索引的优势,您可以尝试以下方法

Create Temporary TABLE t (id INT, crc INT);

Insert Into t
Select 500, CRC32(UPPER('name1'))
Union Select 500, CRC32(UPPER('name2'))
Union Select 500, CRC32(UPPER('keyword1'))
Union Select 500, CRC32(UPPER('keyword2'));

Select * From t Where crc = CRC32(UPPER('keyword2');

从名称为“%searched\u word%”的业务中选择*这应该有效。我不明白这个问题。请你澄清一下好吗?我一直在以同样的目的使用这个查询work@LuigiMackenzieC.Brito问题是查询速度非常慢,因为它不使用索引,而是搜索整个表!Dang,它不会只搜索整个“命名”列吗?它不会使用索引,看到这个哇,我学到了一些新东西:)谢谢你的回答。但不幸的是,我不能使用myisam引擎。我可以用InnoDb。因为我使用的是aws rds。所以我没有办法使用全文搜索。thanksInnoDB还支持MySQL 5.6.My Error之后的全文搜索。好消息!
Create Temporary TABLE t (id INT, crc INT);

Insert Into t
Select 500, CRC32(UPPER('name1'))
Union Select 500, CRC32(UPPER('name2'))
Union Select 500, CRC32(UPPER('keyword1'))
Union Select 500, CRC32(UPPER('keyword2'));

Select * From t Where crc = CRC32(UPPER('keyword2');