2010-08-09 3 views
0

У меня есть таблица книг в моей базе данных MySQL, которая имеет столбцы Title (varchar (255)) и Edition varchar (20)). Примерами таких значений являются «Введение в микроэкономику» и «4».FULLTEXT поиск по очень маленькой колонке

Я хочу, чтобы пользователи искали книги на основе названия и издания. Так, например, они могут войти в «Микроэкономика 4», и это принесет правильный результат. Мой вопрос заключается в том, как я должен установить это на стороне базы данных.

Мне сказали, что поиск FULLTEXT - это, как правило, хороший способ делать такие вещи. Однако, поскольку издание иногда представляет собой только один символ («4»), полный текстовый поиск должен быть настроен для просмотра отдельных символов (ft_min_word_len = 1). Это, я слышал, очень неэффективно.

Итак, как мне настроить поиск в этой базе данных? Я знаю, что CONCAT/LIKE можно использовать здесь. Мой вопрос заключается в том, будет ли это лучший способ, или будет ли он слишком медленным по сравнению с альтернативами. В моей книжной базе данных сотни тысяч книг, и многие пользователи будут ее искать.

ответ

0

Вы можете установить полный текстовый индекс в столбце title и сопоставлять только цифры на столбце edition со стандартными операторами (>, <, =). Хотя вам нужно извлечь информацию из поискового запроса на бизнес-уровне.

+0

проблема заключается в том, что я не могу придумать правило для дискриминационных изданий. Примерные значения: - «4» - «4-й» - «выпуск 25-й годовщины» - «выпуск специального коллекционера» – babonk

1

Если вы ищете точный поиск в редакции, обходя ft_min_word_len, я бы рекомендовал иметь два поля в форме поиска пользователя, один для Title, один для версии, так что вам не нужно гадать, если/где это издание, указанное в поисковой фразе (и издание также может быть необязательным). В этом случае поиск в редакции в колонке редакции будет с «LIKE».

Другое решение - так как размеры вашего символа довольно малы - это создать новый столбец, посвященный индексу/поиску FullText, в котором вы объединяете заголовок и редакцию. Чтобы не беспокоиться о ft_min_word_len и Edition, сначала соедините первое зарезервированное вами слово, которое вряд ли будет искать пользователи, такие как «EDNB» и Edition, когда это число (или небольшое).

В этом случае, когда вы создаете новый столбец, разбор Edition (это может быть сделано за титул, а):

  • Изменить все только-цифру слово п к «EDNB» + п (например, "4" => "EDNB4")
  • Тогда NewColumn = Title + "" + NewEdition

Когда пользователь ищет что-то,

  • язь ntifies все ее номера в поисковой фразе и заменяет их «EDNB» + n.

Возможно, вы захотите изменить ft_min_word_len на 3, чтобы поймать «1-й» или «3-й» (или вы также можете их использовать).

Обратите внимание, что наличие нового независимого столбца поиска может быть удобным: не для чувствительности к регистру (поскольку Fulltext делает это уже), а для поиска слов с акцентами с ошибками. Вы бы изменили все акценты на письмо без акцента.

Например, если название «Recette de la crème brûlée», а издание «France 4», вы получите столбец поиска «recette de la creme brulee france EDNB4».Если пользователь ищет «crëme 4», «ë» изменяется на «e», «4» на «EDNB4», а ее поисковая фраза становится «creme EDNB4».

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