Поиск по словам длиной в один символ (MySQL) - PullRequest
3 голосов
/ 28 июля 2010

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

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

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

Итак, как мне настроить поиск в этой базе данных?

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

Ответы [ 2 ]

3 голосов
/ 28 июля 2010

вот шаги для решения

1) прочитать строку поиска у пользователя.

2) сделать строку в части в соответствии с пробелом ("") между словами.

3) использовать следующий запрос для получения результата

SELECT * FROM booksWHERE Title LIKE '% part [0]%' AND Edition LIKE '% part [1]%';

здесь part [0] и part [1] являются отдельными словами из данного слова

код PHP для вышеупомянутого может быть

<?php 
     $string_array=explode(" ",$string); //$string is the value we are searching
     $select_query="SELECT * FROM books WHERE Title LIKE '%".$string_array[0]."%' AND Edition LIKE '%".$string_array[1]."%';";
     $result=mysql_fetch_array(mysql_query($select_query));
?>

для $ string_array [0], его можно расширить, чтобы получить все части, кроме последней, которая может быть применена для случая «Введение в микроэкономику 4»

0 голосов
/ 22 декабря 2010

Для вашего приложения, где вас интересуют просто заголовок и издание, я подозреваю, что использование индекса FULLTEXT с MATCH/AGAINST и сокращение ft_min_word_len до 1 не будет иметь так много влияют на производительность (если бы вы были более подробными или написанными пользователем контентом, то я мог бы сомневаться).

Самый простой способ проверить это - изменить значение, REPAIR таблицу, чтобы учесть новый ft_min_word_len, перестроить индекс и сделать несколько простых сравнительных тестов.

Сказав, что для вашего приложения я мог бы рассмотреть вопрос Сфинкс . Это определенно будет намного быстрее, а ваш контент относительно статичен, поэтому задержка между переиндексацией (главный недостаток Сфинкса - IMO) - не проблема. Кроме того, с осторожным использованием словоформ и исключений вы можете сопоставить такие вещи, как 4 / четыре / четвертый / IV, с одним и тем же маркером для улучшенного поиска.

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