Заголовок и теги поиска PHP - PullRequest
1 голос
/ 13 сентября 2009

Привет, Я думаю о лучшем способе поиска на моем сайте. Я знаю о полнотекстовом поиске в Sphinx и MySQL, но я не просто ищу по одному полю.

У меня есть две вещи, которые я хочу найти: название статьи и теги, связанные с этой статьей.

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

Например, если заголовок статьи был «как построить домашний кинотеатр» и имел теги «сделай сам», «технология», это поле было бы «технология изготовления домашнего кинотеатра своими руками». Затем я мог бы выполнить поиск по этому полю.

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

Есть ли лучший способ сделать это?

Ответы [ 4 ]

1 голос
/ 13 сентября 2009

Sphinx может выполнять поиск по нескольким столбцам. Это даже позволяет определить «вес» для каждого столбца. Я думаю, что вы должны придерживаться этого.

0 голосов
/ 18 сентября 2009

Sphinx, Lucene и почти весь полнотекстовый поиск не ограничиваются отдельными полями. Фактически по умолчанию выполняется поиск по всем полям, а затем фильтрация по указанным. Я думаю, что внутренний поиск MySQL не очень хорош, плагины Sphinx и Lucene намного лучше.

0 голосов
/ 13 сентября 2009

Используйте многозначные атрибуты в Sphinx для своих тегов:

МВА, или многозначные атрибуты, являются важным специальным типом атрибутов для каждого документа в Sphinx. МВА позволяют прикреплять списки значений к каждому документу. Они полезны для тегов статей, категорий товаров и т. Д. Поддерживается фильтрация и группировка (но не сортировка) атрибутов MVA.

http://www.sphinxsearch.com/docs/current.html#mva

0 голосов
/ 13 сентября 2009

Вы можете выполнять полнотекстовый поиск по нескольким столбцам таблицы в MySQL в MyISAM.

См:

$search = 'how to do short circuit evaluation?';
$q = 'SELECT * FROM `table` WHERE MATCH(tags, title, description) AGAINST ('.mysql_real_escape_string($search).' IN BOOLEAN MODE)';
$r = mysql_query($q);
//.. so on

Выполнение другой таблицы требует постоянной синхронизации, и это довольно утомительно для вашей системы.

Поскольку ваши теги находятся во многих отношениях, вы можете получить их и объединить в запрос

$q = 'SELECT * FROM `table` WHERE'.
  ' MATCH(tags, title, '.
  '(SELECT  GROUP_CONCAT(`tag`) FROM `tags`'.
  'WHERE `ArticleID`='.(int)$ArticleID.')'.
  ') AGAINST ('.mysql_real_escape_string($search).' IN BOOLEAN MODE)';
...