mysql поисковый запрос - PullRequest
       3

mysql поисковый запрос

1 голос
/ 20 ноября 2010

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

CREATE TABLE `data_import` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`payee` VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `payee` (`payee`)
)

У меня также есть таблица, в которой хранятся правила импорта:

CREATE TABLE `import_rules` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`search` VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `search` (`search`)
)

Идея состоит в том, что для каждой импортированной транзакции запрос должен пытаться найти единственное правило соответствия - это сопоставление выполняется в полях data_import.payee и import_rules.seach. Поскольку оба поля varchar, я проиндексировал их в надежде ускорить выполнение запроса.

Это то, что я до сих пор придумал, что, кажется, работает нормально.

SELECT i.id, i.payee, i.amount, i.posted r.id, r.search
FROM import_data id
LEFT JOIN import_rules ir on i.payee = ir.search

Так, например, допустим, что у нас есть запись import_rules.search «кока-кола» и запись import_data.payee «кока-кола». Тогда мы получим совпадение.

Теперь, допустим, мы хотим сделать это немного более гибким и сделать так, чтобы даже если поиск соответствовал части получателя, мы получили совпадение. Таким образом, import_rules.search = 'cola' и import_data.payee = 'кока-кола' все равно должны привести к совпадению.

Насколько я понимаю, различные "LIKE '% search%'" имеют плохую производительность. Я работаю на innodb, поэтому не уверен, что альтернативы текстового поиска от myisam вариант. Возможно, я смогу поменять эту таблицу, если потребуется.

1 Ответ

0 голосов
/ 20 ноября 2010

для этого случая вы можете использовать MATCH (field1) AGAINST(value) для поиска перикулярных слов из базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...