[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Поиск разных комбинаций
WannaKnow
Прошу помощи.
Подскажите, как можно осуществить следующий поиск по одному полю:
допустим, есть таблица, в ней в столбце идет перечень слов, выражений, фраз (то есть в поле может быть как одно слово, так и два, так и целая фраза; причем, слова могут быть абсолютно любой длины - 1 символ, 2 символа, 3 и т.д.). Вот по одному только этому полю со словами и выражениями нужно сделать поиск.
Вот тут и загвоздка. Поиск нужно сделать так, чтобы находились те выражения и фразы, которые немного отличаются от исходно заданных (через LIKE не получается, как и через FULLTEXT). Например: в поле выражение "это слово было произнесено вслух". В поиске вводится: "слово было произнесено" - через LIKE это выражение будет найдено. Однако если в поиске ввести "слово произнесено вслух" - через LIKE найдено уже не будет (т.к. пропущено слово "было"). Прошу подсказать, как сделать так, чтобы скрипт сначала проверял наиболее близкое совпадение слов, затем, менее близкое (например, как в примере - где пропущено слово), и так далее, до самого меньшего совпадения (где, например, встречается лишь одно из введенных слов).
Заранее спасибо.



Спустя 1 час, 46 минут, 51 секунда (7.08.2011 - 17:11) kovaldm написал(а):
Разбивай поисковый запрос по словам и ищи их, затем сортируй результат запроса по количеству вхождений.

Спустя 1 час, 2 минуты, 36 секунд (7.08.2011 - 18:14) ИНСИ написал(а):
WannaKnow как самый простой пример, можно так:
$string = 'мы пошли гулять по парку'; // Искомая строка
$query = "WHERE ( `pole` LIKE '%" . $string . "%' )"; // Ищем в начале нашу строку

$arrWords = explode(' ', $string); // Разбиваем строку
if(sizeof($arrWords) > 0) { // Если в строке больее 1 слова
foreach($arrWords as $data) { // Обходим циклом
$query .= " OR ( `pole` LIKE '%{$data}%' )"; // Прибавляем к запросу
}
}


// Сам запрос
mysql_query("
SELECT *
FROM `table`

{$query}
");

Если проставишь везде индексы, будет работать гораздо быстрее поиск.

Спустя 4 часа, 16 минут, 28 секунд (7.08.2011 - 22:30) WannaKnow написал(а):
kovaldm
INSIDIOUS
Спасибо за ответы.

Спустя 5 минут, 25 секунд (7.08.2011 - 22:36) ИНСИ написал(а):
WannaKnow всегда пожалуйста wink.gif

Спустя 9 часов, 8 минут, 18 секунд (8.08.2011 - 07:44) linker написал(а):
Разбиваем строку на слова
SELECT * FROM `table` WHERE MATCH(`column`) AGAINST('+слово +произнесено +слух' IN BOOLEAN MODE)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.