2016-06-21 5 views
0

Справочная информация:полнотекстовый поиск не работает на двух колонках

Эй, я использую MySQL 5.6.17 InnoDB, я прочитал на сайте тузд что FULLTEXT теперь доступна для InnoDB в 5.6+ версии. так что я не должен меняться от InnoDB к MYISAM Here is the link я изменил два моих столбцов таблицы для поиска FULLTEXT, используя следующий запрос

ALTER TABLE `es_officers` ADD FULLTEXT Index_officer_name (es_officer_name) 
ALTER TABLE `es_officers` ADD FULLTEXT Index_officer_fname (es_officer_fname) 

Измененная таблица в отношении информации схемы:

Тогда я проверяется в моей информационной схеме, если измененные столбцы таблицы зарегистрированы или не выполнив следующий запрос

SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME 
FROM statistics 
WHERE index_type LIKE 'FULLTEXT%' 

Он показал мне два exacttly результаты, которые я ожидал

Information Schema results

Проблема:

, когда я написать запрос MATCH жалом против двух столбцов дает мне ошибку

SELECT * FROM `es_officers` WHERE MATCH (es_officer_name, es_officer_fname) AGAINST ('abc') 

#1191 - Can't find FULLTEXT index matching the column list 

НО:

когда Я пытаюсь запросить столбцы отдельно, как показано ниже. абсолютно штраф

SELECT * FROM `es_officers` WHERE MATCH (es_officer_name) AGAINST ('abc') 

SELECT * FROM `es_officers` WHERE MATCH (es_officer_fname) AGAINST ('abc') 

Я не знаю, что это я делаю неправильно, помощь очень ценится.

ответ

1

Множественные вопросы:

У вас есть два отдельных индекса полнотекстового, каждый из которых охватывает одно поле. У вас есть WHERE MATCH (es_officer_name, es_officer_fname) в качестве запроса, для которого требуется индекс SINGLE, охватывающий оба поля. MySQL не будет использовать два отдельных индекса для этого запроса - он не может. это не то, как работает полнотекстовая индексация. Вам нужно добавить alter ... fulltext (es_officer_name, es_officer_fname).

И даже тогда abc подпадает под значение по умолчанию minimum word length и не будет индексироваться.

+0

ОК, так что если я делаю ALTER TABLE 'es_officers' ADD FULLTEXT Index (es_officer_name, es_officer_fname), и если минимальная длина слова равна 4, которая по умолчанию для mysql fulltext, это должно работать правильно? также я должен задать вам несколько вещей – Wcan

+0

1: Я пытался избежать следующего запроса, потому что у меня около 20 столбцов в одной таблице, и мне приходилось сопоставлять строку через каждый столбец, но в случае FULLTEXT моя минимальная длина слова 4, и если я дам 2, это не сработает. SELECT * FROM 'es_officers' ГДЕ es_officer_name LIKE '% ABC%' ИЛИ ​​es_officer_fname LIKE '% ABC%' ИЛИ ​​es_officer_EDFA LIKE '% ABC%' Я должен написать этот "LIKE '% ABC'" часть в 20 раз, есть ли способ избежать этого? – Wcan

+0

вы можете изменить минимальную длину. он настраивается. вам просто нужно перестроить индексы после изменения пределов длины. и поскольку 'как% ...%' запросы не могут использовать индексы в любом случае, вы можете взломать более простую версию, такую ​​как 'concat (field1, field2 и т. д.) LIKE '% abc%''. –

0

Кроме того, вы можете попробовать что-то вроде:

SELECT * FROM es_officers 
WHERE MATCH es_officer_name AGAINST ('abc') + MATCH es_officer_fname AGAINST ('abc') 

Хотя, как Marc B сказал, 'ABC' значение является слишком коротким.

+0

Спасибо, что я прыгнул в FULLTEXT, потому что я пытался избежать повторения части строки или части MATCH() AGAINST(), для части LIKE @Marc B сказал мне использовать concat, и это работает, но для полной текстовой части я должен измените мой запрос на изменение таблицы. – Wcan

Смежные вопросы