Вы не должны манипулировать значениями столбцов в предложении MATCH()
вашего запроса, так как это приведет к полному просмотру таблицы, что отрицательно скажется на индексе FULLTEXT
. Это связано с тем, что MySQL необходимо извлечь данные из каждой строки, чтобы определить результирующее значение функции.
Кроме того, изменение условия MATCH
недопустимо с таблицами хранения INNODB , так как Предоставленный список столбцов должен точно соответствовать тому, что находится в индексе FULLTEXT
.
Сгенерированные столбцы DB-Fiddle
Один из подходов заключается в использовании функции Сгенерированные столбцы в MySQL для замены ошибочных символов логического оператора и использовать отдельный индекс FULLTEXT
для сгенерированного столбца.
Сгенерированный столбец позволит вашим исходным данным оставаться неизмененными для использования в других несвязанных полнотекстовых поисках и разрешить использование предложения AGAINST('+5552400*')
без логического значения операторские конфликты. Вторичный столбец также поможет уменьшить количество ложных срабатываний и уменьшить размер индекса, который может возникнуть, добавив дополнительный текст в исходный столбец.
Сгенерированный столбец вызовет незначительное влияние на операции INSERT
и UPDATE
. Поскольку каждая строка будет вызывать дополнительную операцию для автоматического добавления значений второго столбца.
Желаемый результат
| id | search_text |
| --- | --------------------- |
| 1 | called 555-2400 ext 4 |
| 2 | called 555-2400ext 4 |
Схема
CREATE TABLE table_name (
`id` INTEGER,
`search_text` VARCHAR(21),
FULLTEXT idx (search_text)
);
INSERT INTO table_name
(`id`, `search_text`)
VALUES
('1', 'called 555-2400 ext 4'),
('2', 'called 555-2400ext 4'),
('3', 'called 555-2432 ext 1'),
('4', 'called 555-2432ext 1'),
('5', 'called 444-2400 ext 2'),
('6', 'called 444-2432 ext 2');
Добавить сгенерированный столбец
ALTER TABLE table_name
ADD COLUMN search_text_parsed TEXT
GENERATED ALWAYS AS (REPLACE(search_text, '-', '')) STORED,
ADD FULLTEXT INDEX `idx2` (`search_text_parsed`);
Можно добавить дополнительные логические операторы для удаления по желанию, изменив сгенерированное выражение столбца, (REPLACE(REPLACE(search_text, '-', ''), '@', ''))
Поисковый запрос
SELECT *
FROM table_name
WHERE MATCH(search_text_parsed)
AGAINST('+5552400*' IN BOOLEAN MODE);
Результат
| id | search_text | search_text_parsed |
| --- | --------------------- | -------------------- |
| 1 | called 555-2400 ext 4 | called 5552400 ext 4 |
| 2 | called 555-2400ext 4 | called 5552400ext 4 |
Кроме того, вы можете автоматизировать проверку значения термина непосредственно в вашем запросе , чтобы убедиться, что текст не содержит никаких булевых операторов-нарушителей, используя
REPLACE(search_text, '-', '')
SET @term='555-2400';
SELECT *
FROM table_name
WHERE MATCH(search_text_parsed)
AGAINST(CONCAT('+', REPLACE(@term, '-', ''), '*') IN BOOLEAN MODE);
Другие подходы
Поскольку вопрос был задан в По-другому, вот вопрос, который очень напоминает вашу основную проблему: Как разрешить полнотекстовый поиск с дефисами в поисковом запросе