2015-05-16 4 views
0

Я пытаюсь сделать небольшую поисковую систему для своего сайта. Прежде всего, типа пользователя в некоторых ключевых словах и перейти к странице результатов, которые используют этот код:Сортировка результата sql по наличию набора ключевых слов

$result = array(); 
$keyword_tokens = explode(' ', $keywords); 
$keyword_tokens = array_map(
    function($keywords) { 
     return mysql_real_escape_string(trim($keywords)); 
    }, 
    $keyword_tokens 
); 
$sql = "SELECT * FROM search_table WHERE concat(title, description) LIKE '%"; 
$sql .= implode("%' OR concat(title, description) LIKE '%", $keyword_tokens) . "%' ORDER BY instr(description, '$keywords') DESC, instr(title, '$keywords') DESC"; 
$result=mysql_query($sql); 

Этот код позволяет искать ключевые слова, запрашиваемых пользователем и сортировать по $ ключевых слов, так по полной точной строке группа ключевых слов ...

То, что я пытаюсь сделать, - упорядочить результаты по наибольшему количеству каждого ключевого слова. Например, если строка моего sql-результата содержит 5 ключевых слов, а другая - 3 и т. Д., Сначала должны появиться 5 ключевых слов. Я ищу, чтобы отсортировать результаты, выбрав большее количество ключевых слов.

Надеюсь все понятно ...

Помощь будет очень признателен!

+1

Возможно, посмотрите на полнотекстовые индексы – Strawberry

+0

. Я не получил ваш вопрос ?? .. если пользователь вводит ключевое слово, и наиболее типичный результат должен быть первым? ?. это то, что ур? –

+0

Привет, пользователь выбирает $ ключевые слова в форме, которая отправляется на страницу поиска. Я ищу, чтобы отсортировать результаты, выбрав большее количество ключевых слов. – jpsFR

ответ

0

Прекрасная вещь о MySQL, в зависимости от вашей точки зрения. Он рассматривает данные о том, как он думает, что вы хотите, чтобы с ним обращались. 1 + '1'? довольно ясно, что вы хотите обрабатывать строку как число, поэтому он с радостью выполняет добавление для вас.

Работы для булевых операндов тоже (просто нужно следить за приоритетом оператора). (a like '%foo%') + (a like '%bar%') распознает числовой контекст, обрабатывает логический результат true как 1 и логический результат false как 0 - по сути подсчет соответствия ключевых слов для вас.

Как вы можете это использовать? Возьмите свой пункт where, замените все or на + и убедитесь, что инструкция каждого пользователя like завернута в скобки, затем order by.

например:

order by (concat(title, description) like '%keyword1%') 
    + (concat(title, description) like '%keyword2%') desc 

Вы можете сделать что-то подобное, используя fulltext index, но взвешивание может быть немного странно. Синтаксис для этого будет:

create fulltext index idx on search_table(title, description) 

^^ просто сделайте это бит один раз.

select * 
    from search_table 
    where match(title, description) against ('keyword1 keyword2 ...') 
    order by match(title, description) against ('keyword1 keyword2 ...') desc 

У этого есть суровый бонус быть гораздо менее раздражающим для построения запроса.

Here's a proof of concept for you, который демонстрирует оба метода. (хотя и только против одного столбца, но он получает точку)

+0

Hi Pala, просто отлично работайте! Спасибо огромное ! – jpsFR