2010-07-28 3 views
3

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

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

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

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

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

ответ

0

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

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

Сказав, что для вашего приложения я мог бы рассмотреть возможность поиска в Sphinx. Это определенно будет величинами быстрее, и ваш контент относительно статичен, поэтому задержка между повторной индексацией (основной недостаток ИФН Сфинкса) не является проблемой. Кроме того, при тщательном использовании wordforms и exceptions вы могли бы сопоставлять вещи, такие как 4/four/4th/IV, все с тем же маркером для улучшения поиска.

3

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

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

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

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

SELECT * FROM книг, где Название LIKE '% часть [0]%' и выпуск LIKE '% части [1]%';

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

РНР код выше может быть

<?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

Проблема с расщеплением слов заключается в том, что заголовки имеют пробелы, поэтому вы не можете знать, является ли это изданием или заголовком. Конечно, метод LIKE можно использовать, выполнив CONCAT() в заголовке и редакции в сравнении LIKE. Мой вопрос в основном - будет ли это идти медленно? Я слышал, что люди используют FULLTEXT, потому что LIKE так медленно. В моем db есть сотни тысяч книг, и многие люди будут использовать базу данных. – babonk

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