Расширенный поиск - PullRequest
       24

Расширенный поиск

1 голос
/ 03 мая 2010

У меня есть веб-сайт с функцией автозаполнения поиска на основе jQuery, которая прекрасно работает.

В настоящее время, хотя у меня есть только одно поле поиска для всех категорий, я хочу, чтобы кто-то мог набрать, например, dorian gray dvd (в любом порядке), который будет искать dorian gray в пределах dvd категория. В этом случае потребуется немного волшебства на стороне сервера, чтобы выяснить, являются ли какие-либо слова ключевыми словами категории, а затем ограничить поиск этим.

Каков наилучший (и самый быстрый) способ сделать это в PHP / MySQL?

В настоящее время у меня есть несколько мыслей

  • Поиск в категории стол для матчей и, возможно, порядок результаты по этому.
  • Или разделите условия поиска на массив и отдельно искать категории для этого на матч.
  • Еще одна мысль, которую я только что имел, конкатать название категории на DVD заголовок в базе данных и совпадение против этого или что-то подобное ... но это звучит вычислительно дорого?

Любой совет?

Ответы [ 2 ]

0 голосов
/ 04 мая 2010

IN () пригодится здесь. Есть несколько методов, они различаются по сложности и производительности Я предполагаю, что у вас есть таблица категорий, и что все, что использует категорию, использует ее по идентификатору категории, например так:

categories
    id
    name

posts
    id
    category
    name

Эта функция также удаляет ключевые слова, которые соответствуют категории - как вы описали. Это также позволяет вам искать несколько категорий. Это оставляет вашу поисковую реализацию на ваше усмотрение, хотя я не рекомендую использовать LIKE "% keyword%", так как это действительно снижает производительность.

Использовать ключевое слово IN

$keywords = $escaped_keywords = explode(' ', $user_input);
array_walk($escaped_keywords, 'db_escape');
$query = 'SELECT id, name FROM categories WHERE name IN ("' . implode('", "', $escaped_keywords) . ")";
$result = db_query($query);
$category_in = '';
while($row = db_fetch($result)) {
    $category_in .= ($category ? ', ' : '') . db_escape($row['id']);
    unset($keywords[$row['name']))
}
if($category_in) {
    // $where is your conditional from your current script
    $where .= ($where ? ' AND ' : '') . "category IN($category_in)";
}

Вместо этого создайте поисковый индекс

Другое решение значительно сложнее, так как требует создания поискового индекса. Поисковый индекс позволит вам вставить названия категорий в часть поискового индекса и пометить их как более релевантные для этого ключевого слова (чем, скажем, в теле сообщения), а также пометить категорию как более релевантную, чем другие ключевые слова. Преимущество этого в том, что у вас есть все виды контроля над тем, что появляется первым: что-то вроде:

SELECT p.*, MAX(pi.relevance) relevance FROM posts LEFT JOIN post_index pi ON pi.post = post.id WHERE keyword IN (keyword_list) GROUP BY pi.post_date, pi.post ORDER BY relevance DESC

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

0 голосов
/ 04 мая 2010

Ваша первая идея, вероятно, самая быстрая в отношении циклов и строк кода. Разнесите поисковый запрос, оберните каждую часть нового массива, чтобы отформатировать его, чтобы вы могли развернуть его и добавить новую строку прямо в конце вашего запроса MySQL.

Затем просто получите результат и добавьте его к поисковому запросу. Для экономии места отформатируйте поисковый запрос одновременно с запросом категорий.

$temp=explode(" ", $string);
foreach($temp as $key=>$var) {
   $where[$key]=>"category='".mysql_real_escape_string($var)."'";
   $where2[$var]=>"field like '%".mysql_real_escape_string($var)."%'"; //formating the second query at the same time
}
$result=mysql_query("SELECT name FROM categories WHERE ".implode(" OR ", $where));
$cat=mysql_fetch_object($result)->name;
unset($where2['cat']); //removing the category from the search
$where2=implode(" OR ", $where2);
$result=mysql_query("SELECT * FROM table WHERE ($where2) and category='$cat'");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...