Я пытаюсь сделать небольшую поисковую систему для моего сайта.
Прежде всего, введите несколько ключевых слов и перейдите на страницу результатов, которая использует этот код:
$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 ключевых слов должны появиться первыми. Я ищу, чтобы отсортировать результаты по большему количеству подходящих ключевых слов.
Надеюсь, все понятно …
Помощь будет по достоинству оценена!
Прекрасная вещь в 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
Это имеет серьезный бонус, так как гораздо менее раздражает создание запроса.
Вот вам подтверждение концепции что демонстрирует оба метода. (хотя только против единственного столбца — но это передает смысл)
Других решений пока нет …