Соответствие точного значения с полнотекстовым поиском в MyISAM

У меня есть таблица с двумя столбцами: электронная почта и идентификатор. Я хочу найти точное совпадение значения электронной почты в столбце.

Я установил свою таблицу с MyISAM Engine и установил столбец электронной почты с индексом FullText. Когда я запускаю запрос для поиска точного совпадения, он иногда работает, а иногда не работает.

это мое определение таблицы

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 ('[email protected]') 
limit 1;

Иногда это срабатывает, а иногда не удается вернуть результат сопоставления, даже если результат сопоставления есть в таблице. Я что-то не так делаю? Что мне делать, чтобы соответствовать точному значению при полнотекстовом поиске?

Я также пробовал использовать В БУЛЕВОМ РЕЖИМЕ, но это тоже бесполезно.

select uid from tbl_email where MATCH(email) AGAINST ('[email protected]' 
IN BOOLEAN MODE) limit 1;

person Community    schedule 18.02.2014    source источник
comment
зачем вообще использовать полный текст? просто используйте: select uid from tbl_email where email='[email protected]' limit 1;   -  person    schedule 19.02.2014
comment
он периодически дает сбой в ОДНОЙ строке, когда вы запускаете один и тот же запрос несколько раз? Или на разных струнах?   -  person Marc B    schedule 19.02.2014


Ответы (3)


Насколько мне известно, поиск по индексу FullText интерпретирует строку поиска как фразу на естественном человеческом языке и разбивает слова, если это необходимо для поиска, как сказано на http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html и, самое главное, посмотрите здесь

* Применяется список запрещенных слов. Кроме того, слова, которые присутствуют в 50% или более строк, считаются общими и не совпадают. *

И я считаю, что каждое ваше электронное письмо будет содержать .com (. Как стоп-слово), что означает, что вся ваша таблица будет сопоставляться с заданным вами поиском.

Вам лучше пойти с простой индексацией с InnoDB, так как это будет лучше для более быстрой вставки записей и упрощения предложения where.

Я не знаю, какой алгоритм используется для полнотекстового поиска, в отличие от обычного индекса для строкового поиска, но предположим, что если вы делаете это с полнотекстовым индексированием, я думаю, из-за различных интерпретаций это займет больше, чем обычный индекс, потому что тогда ему придется посмотрите каждое значение электронной почты, так как у всех есть стоп-слова, такие как @ и .com и т. д. Но это только мое понимание, что я не создатель алгоритмов поиска данных.

person Airy    schedule 18.02.2014

Вам не обязательно использовать полный текст, вы можете просто запустить:

SELECT uid FROM tbl_email WHERE email='[email protected]' LIMIT 1;

Этот запрос должен возвращать именно то, что вы хотите получить.

person Tom    schedule 18.02.2014
comment
Так разве мне не нужно использовать индекс FullText для моей таблицы? - person ; 19.02.2014

Согласно справочной странице MySQL 5.5 при использовании FULLTEXT для найдите точные фразы, заключите их в одинарные и двойные кавычки. Одиночные кавычки являются разделителями, а двойные кавычки инкапсулируют ваш запрос.

e.g. : ... MATCH(email) AGAINST('"[email protected]"') ...

Тем не менее, повторяя то, что уже сказали другие, простое предложение WHERE избавит вас от внешнего вида вашего запроса. Я думаю, что FULLTEXT лучше подходит для поиска ключевых слов в кучах информации внутри записи, а не в полях с одним значением, таких как поле электронной почты.

person Crackertastic    schedule 18.02.2014
comment
Так разве мне не нужно использовать индекс FullText для моей таблицы? Разве FullText не ускорит поиск по моему запросу? - person ; 19.02.2014
comment
@CodeDevil Если вы хотите сделать это поле быстрее при поиске, просто создайте для него обычный индекс. Используйте FULLTEXT индексы для поиска ключевых слов в больших наборах информации. - person Crackertastic; 19.02.2014
comment
Я думаю, вы правы. Потому что я изо всех сил старался это сделать. - person ; 19.02.2014
comment
Будет ли тогда достаточно InnoDB для простой индексации текстового контента? - person ; 19.02.2014
comment
IMO, InnoDB лучше, а MyISAM по нескольким причинам, например, встроенная поддержка ограничений. Однако в MySQL 5.5 и ниже вы не можете использовать FULLTEXT, но можете в 5.6+. Если вам не нужен MyISAM по какой-то особой причине, я бы порекомендовал InnoDB. Затем проиндексируйте свое поле email и выполните для него простые предложения WHERE, что, вероятно, будет достаточно быстро для получения адреса электронной почты. Если вы обнаружите, что используете предложения LIKE с подстановочными знаками % - избегайте использования его в левой части строки любой ценой! Левая сторона аннулирует цель вашего индекса. - person Crackertastic; 19.02.2014