MySQL поиск по столбцу и замена текста - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь удалить указанный c символ (дефис / da sh) из mysql совпадения с запросом, так как поиск фактического da sh выдает ошибку. Вот что у меня есть, но я получаю сообщение об ошибке, что при использовании match + replace неправильный синтаксис

SELECT *
FROM table
WHERE
MATCH (replace(search_text,'-','')) 
AGAINST ('+5552400*' IN BOOLEAN MODE)

Столбец search_text имеет значение 555-2400, с которым я пытаюсь сопоставить , Поиск должен включать подстановочный знак.

search_text может содержать от 4 до 500 символов. Это могут быть номера телефонов, адреса электронной почты, почтовые адреса, имена, фамилии и многое другое.

Это для автоматического завершения поиска, и результат 555-2400 должен показать вверх, если я наберу любой из следующих:

5
55
555
555-
555-2
555-24
555-240
555-2400

Ответы [ 3 ]

2 голосов
/ 06 апреля 2020

Вы не должны манипулировать значениями столбцов в предложении 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);

Другие подходы

Поскольку вопрос был задан в По-другому, вот вопрос, который очень напоминает вашу основную проблему: Как разрешить полнотекстовый поиск с дефисами в поисковом запросе

1 голос
/ 06 апреля 2020

Попробуйте изменить SQL -запрос, чтобы он соответствовал точной фразе (используя двойные кавычки), это позволит вам включить da sh в ваш запрос.

SELECT *
FROM table
WHERE
MATCH (search_text) 
AGAINST ('+"555-2400"' IN BOOLEAN MODE)

Обратите внимание, что вы будете потеряйте звездочку (*) в конце этого пути, что может быть проблемой для вас. Это означает, что вы больше не будете получать результаты, которые просто начинаются с «555-2400», а только те, которые точно соответствуют.

См. Дополнительную информацию здесь: https://dev.mysql.com/doc/refman/8.0/en/fulltext-boolean.html

0 голосов
/ 06 апреля 2020

Исходя из того, как вы описываете свою проблему, возможно, вам лучше использовать обычный индекс (а не полнотекстовый индекс)

ALTER TABLE table_name ADD INDEX (search_text);

Тогда вы можете выполнять эффективные запросы "с начала", используя LIKE '<search-term>%' пункты.

Например,

SELECT *
FROM table_name
WHERE search_text LIKE '555%'

Больше информации здесь: https://dev.mysql.com/doc/refman/8.0/en/index-btree-hash.html

...