MySQL Fulltext против Like - PullRequest
       6

MySQL Fulltext против Like

0 голосов
/ 13 января 2011

Фон У меня есть таблица с максимум 2000 строками, пользователь должен искать до 6 столбцов.
Я не знаю заранее, что он ищет, и я хочу объединенный поиск (search1И search2 AND ...)

Проблема В этих столбцах у меня есть идентификатор, а не простое описание (то есть у меня есть идентификатор города, а не его название).Итак, я думал о двух решениях:

  1. Создайте еще одну таблицу, в которую я помещаю ключевые слова (1 ключ / строка), а затем я ищу там, используя LIKE search1% ИЛИ LIKE search2% ...
  2. Добавить поле в существующую таблицу, в которое я поместил все ключевые слова, а затем произвел FULLTEXT для этого

Какое из них лучше?Я знаю, что строк так мало, что не будет больших проблем с производительностью, но я надеюсь, что они будут получать все больше и больше:)

Пример
Это моя таблица:

ID |ГОРОД |ТИП |АДРЕС |
11 |14132 |3 |пекарь улица 220
13 |45632 |8 |главная улица 12

14132 = Лондон
45632 = Нью-Йорк
3 = Клиент
8 = Администратор

Пользователь, набравший "Лондонский клиент", должен найти первую строку.

Ответы [ 3 ]

1 голос
/ 13 января 2011

Если вы просто собираетесь использовать серию LIKE, то я подумал бы, что имеет смысл использовать индекс FULLTEXT, основная причина в том, что он позволит вам использовать более сложные логические запросы вбудущее.(Как утверждает @Quassnoi, вы можете просто создать индекс, если вы не используете конкретное поле.)

Однако следует отметить, что у полнотекста есть свои ограничения - слова, которые являются общими для всехстроки имеют низкую «оценку» и, следовательно, не будут совпадать так заметно, как если бы вы выполнили серию LIKE.(С другой стороны, вы, конечно, можете получить «оценку» из запроса FULLTEXT, который может быть полезен в зависимости от того, как вы хотите ранжировать результаты.)

0 голосов
/ 13 января 2011

Учитывая, что у вас есть данные в отдельных таблицах, вам потребуется индекс FULLTEXT для каждого из полей поиска в каждой таблице. После этого нужно просто создать запрос с соответствующими соединениями JOIN, чтобы вы могли выполнять полный текст MATCH ПРОТИВ текстовой версии поля, а не номера внешнего ключа.

SELECT user.id, user.name, town.name
FROM user
LEFT JOIN town ON user.town = town.id
WHERE MATCH(user.name, town.name) AGAINST (...)
0 голосов
/ 13 января 2011

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

CREATE  fx_mytable_fields ON mytable (field1, field2, field3)

SELECT  *
FROM    mytable
WHERE   MATCH(field1, field2, field3) AGAINST ('+search1 +search2')

Это вернет все записи, которые содержат search1 и search2в любом из полей, например:

field1   field2     field3
--       --         --
search1  something  search2

или это:

field1           field2      field3
--               --          --
search1 search2  something   something else
...