ПОЛНЫЙ ТЕКСТ поиск по очень маленькой колонке - PullRequest
0 голосов
/ 09 августа 2010

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

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

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

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

Ответы [ 2 ]

1 голос
/ 18 августа 2010

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

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

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

  • Измените все однозначные слова n на "EDNB" + n (например, "4" => "EDNB4")
  • Тогда NewColumn = Title + "" + NewEdition

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

  • идентифицирует все ее номера в поисковой фразе и заменяет их на "EDNB" + n.

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

Обратите внимание, что наличие нового независимого столбца поиска может быть удобным: не для учета регистра (так как 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».

0 голосов
/ 09 августа 2010

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

...