Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将精确值与MyISAM中的全文搜索匹配_Php_Mysql_Search_Full Text Search_Myisam - Fatal编程技术网

Php 将精确值与MyISAM中的全文搜索匹配

Php 将精确值与MyISAM中的全文搜索匹配,php,mysql,search,full-text-search,myisam,Php,Mysql,Search,Full Text Search,Myisam,我有一个表,有两列作为电子邮件和ID。我想在列中搜索完全匹配的电子邮件值 我已经用MyISAM引擎设置了我的表,并用全文索引设置了电子邮件列。当我运行查询来搜索精确匹配时,它有时工作,有时失败 这是我的表格定义 CREATE TABLE `tbl_email` ( `email` varchar(60), `uid` int(11) FULLTEXT KEY `EmailIndex` (`email`) ) ENGINE=MyISAM DEFAULT CHARSET=la

我有一个表,有两列作为电子邮件和ID。我想在列中搜索完全匹配的电子邮件值

我已经用MyISAM引擎设置了我的表,并用全文索引设置了电子邮件列。当我运行查询来搜索精确匹配时,它有时工作,有时失败

这是我的表格定义

CREATE TABLE `tbl_email` (
    `email` varchar(60),
    `uid` int(11)
    FULLTEXT KEY `EmailIndex` (`email`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
这是我的查询,以匹配我的电子邮件值

select uid from tbl_email where MATCH(email) AGAINST ('abcdefghi@yahoo.com') 
limit 1;
它有时工作,有时即使表中有匹配结果,也无法返回匹配结果。我做错什么了吗?在全文搜索中,我应该如何匹配精确值

我也尝试过在布尔模式下使用,但这是一样的,没有像这样的用途

select uid from tbl_email where MATCH(email) AGAINST ('abcdefghi@yahoo.com' 
IN BOOLEAN MODE) limit 1;

您不必使用全文进行匹配,只需运行:

SELECT uid FROM tbl_email WHERE email='abcedfghi@yahoo.com' LIMIT 1;
该查询应准确返回您想要获取的内容。

根据当使用全文查找准确短语时,您可以将它们括在单引号和双引号中。单引号是分隔符,双引号封装查询

e、 g.:。。。将电子邮件与'someone@example.com“


然而,与其他人已经说过的话相呼应的是,一个简单的WHERE子句可以让您从查询的外观中通过。我认为全文更适合在记录中的信息堆中查找关键字,而不是像电子邮件字段那样的单值字段。

据我所知,全文索引搜索将搜索字符串解释为自然人类语言中的短语,并在必要时断开单词进行搜索,如上文所述,最重要的请参见此处

*停止字列表适用。此外,出现在50%或更多行中的单词被视为常见且不匹配。*

我相信你的每封邮件都会有.com。作为stopword,这意味着您的整个表将与您提供的搜索相匹配

您最好使用InnoDB进行简单索引,因为这样可以更快地插入记录并简化where子句


我不知道全文搜索使用的是什么算法,而不是字符串搜索的普通索引,但假设您使用全文索引,我猜,由于不同的解释,它需要比正常索引更多的索引,因为它必须查看每个电子邮件值,因为所有邮件都有@and.com等停止词。但这只是我的理解,我不是数据搜索算法的制定者。

为什么要使用全文?你应该只使用:从tbl_电子邮件中选择uid电子邮件abcdefghi@yahoo.com"限额1,;当您多次运行同一查询时,它会在同一字符串上间歇性失败?或者在不同的字符串上?那么我的表不必使用全文索引吗?那么我的表不必使用全文索引吗?全文是否会使我的查询更快地搜索?@CodeDevil如果您想在搜索时使该字段更快,只需在其上创建一个常规索引即可。使用全文索引在更大的信息集中搜索关键字。我认为你是对的。因为我尽了最大的努力。那么InnoDB是否足以为文本内容建立简单的索引?在我看来,InnoDB和MyISAM更好,原因有几个,比如原生的约束支持。然而,在MySQL 5.5及以下版本中,您不能使用全文,但您可以在5.6+中使用全文。如果您出于某种特殊原因不需要MyISAM,我当然会推荐InnoDB。然后索引您的电子邮件字段并对其运行简单的WHERE子句,这可能足够快速地获取电子邮件地址。如果您发现自己在使用带有%通配符的LIKE子句,请不惜一切代价避免在字符串的左侧使用它!左侧将使您的索引无效。