全文搜索未给出期望的结果

时间:2014-09-05 18:22:34

标签: mysql full-text-search

以下是我跑的命令

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);

上述陈述给了我完美的结果。

2 个答案:

答案 0 :(得分:1)

您好像使用MyISAM存储引擎。在超过50%的所有行中找到的单词将被视为停用词:

您的搜索字词' karan'在5行中有3行,所以它超过了这个标记。

  

MyISAM限制
  对于非常小的表,字分发不会   充分反映其语义价值,有时可能会出现这种模式   在MyISAM表上为搜索索引生成奇怪的结果。对于   例如,虽然“MySQL”这个词出现在每一行中   前面显示的文章表,在MyISAM搜索中搜索单词   index不会产生任何结果:

[...]

  

搜索结果为空,因为“MySQL”一词出现在   至少50%的行,因此被有效地视为一个禁用词。   这种过滤技术更适合大数据集,其中   您可能不希望结果集从a返回每隔一行   1GB表,而不是可能导致效果不佳的小数据集   对于流行的术语。

如果您使用的是MySQL 5.6或更高版本,可以使用InnoDB引擎解决此问题。

  

当您第一次尝试全文时,50%的阈值会让您感到惊讶   搜索它是如何工作的,并使InnoDB表更适合   实验全文搜索。

来自MySQL manual, Natural Language Full-Text Searches

答案 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以获取已找到文档的元数据。