以下是我跑的命令
create database fu;
create table table_name( name varchar(10));
insert into table_name values('karan');
insert into table_name values('nitin');
insert into table_name values('orip');
insert into table_name values('karan orip');
insert into table_name values('karan nitin');
alter table table_name add fulltext(name); //fulltext
select * from products where match(name) against('karan');
现在,上面的查询返回空集。那是为什么?
另外,我是吗
select * from products where match(name) against('karan' in boolean mode);
上述陈述给了我完美的结果。
答案 0 :(得分:1)
您好像使用MyISAM存储引擎。在超过50%的所有行中找到的单词将被视为停用词:
您的搜索字词' karan'在5行中有3行,所以它超过了这个标记。
MyISAM限制
对于非常小的表,字分发不会 充分反映其语义价值,有时可能会出现这种模式 在MyISAM表上为搜索索引生成奇怪的结果。对于 例如,虽然“MySQL”这个词出现在每一行中 前面显示的文章表,在MyISAM搜索中搜索单词 index不会产生任何结果:
[...]
搜索结果为空,因为“MySQL”一词出现在 至少50%的行,因此被有效地视为一个禁用词。 这种过滤技术更适合大数据集,其中 您可能不希望结果集从a返回每隔一行 1GB表,而不是可能导致效果不佳的小数据集 对于流行的术语。
如果您使用的是MySQL 5.6或更高版本,可以使用InnoDB引擎解决此问题。
当您第一次尝试全文时,50%的阈值会让您感到惊讶 搜索它是如何工作的,并使InnoDB表更适合 实验全文搜索。
答案 1 :(得分:0)
由于MySQL内置全文搜索索引的限制和性能问题,我建议使用外部全文引擎,如Sphinx或Lucene / Solr。它们都会为您提供更快的速度和更好的功能和相关性。如果您计划搜索大量数据,这将是强制性的,在这种情况下,MySQL FT搜索可能需要几秒钟才能完成,而基于倒排索引的外部系统可以用毫秒来搜索数据。
Solr是用Java编写的,需要JVM,所以如果你已经在应用程序中使用Java,那么它可能是个不错的选择。 Sphinx是用C ++编写的,用作守护进程并支持MySQL协议,因此可以更容易使用。您可以在这里了解如何使用Sphinx:http://astellar.com/2011/12/replacing-mysql-full-text-search-with-sphinx/ Sphinx还支持可能有用的片段(结果突出显示)。
在使用外部搜索引擎的任何情况下,您可能仍希望查询MySQL以获取已找到文档的元数据。