CREATE TABLE pages
(id SERIAL,
name VARCHAR(1024),
alter VARCHAR(1024),
text MEDIUMTEXT,
PRIMARY KEY id)
ENGINE MyISAM CHARACTER SET utf8;
[добавляем данные]
ALTER TABLE pages ADD FULLTEXT (text);
SELECT text FROM pages WHERE MATCH (text) AGAINST (поисковый запрос);
Как лучше сделать поиск по сайту?
Бегать по всем дирректориям открывать все файлы и, если preg_match=true, то выводим результат.
Работало очень долго ~ 10-ки секунд.
Сейчас:
Валим все страницы в кэш-файл заранее. Получается массив-файл.
Делаем file_get_contents и preg_match. Считаем колличество совпавших слов и на основе колличества совпавших слов выводим первыми те страницы, где совпадений больше.
Скорость работы - средняя ~ 1-цы секунд.
Вопрос:
А будет ли быстрее работать, если страницы поместить в базу MySQL?
А какой тип базы лучше выбрать InnoDB или MyISAM?
Структура базы предполагаемая:
Четыре поля:
id
адрес страницы типа CHAR
псевдоним страницы типа CHAR
содержание страницы типа MEDIUM TEXT
С MyISAM есть какой-то неприятный момент... по-моему нельзя делать связанные таблицы.
А в InnoDB с поиском проблемы...
В InnoDB можно искать как-то так:
SELECT * FROM some_table WHERE text_field REGEXP "некое выражение"
А на много ли эта конструкция медленнее, чем стандартный поиск в MyISAM?
С другой стороны, если у вас материала будет тысяч сто, то тогда имеет смысл думать что быстрее, что медленнее.
Правильная расстановка индексов - и будет поиск работать максимум - десятые доли секунды.
REGEXP не обязательно, достаточно LIKE, если просто поиск фразы в тексте.
Я привык все сразу в InnoDB пихать - особых потерь в скорости не терял никогда.
Лучше в sphinx с последними версиями можно работать, как с SQL-ем.
Цитата:
Лучше в sphinx с последними версиями можно работать, как с SQL-ем.
http://livestreet.ru/blog/dev_documentation/366.html
Поисковый демон...
Да, на своём сервере можно, наверное, а на стороннем hosting'е вряд ли.
Цитата:
MyISAM более быстрый, чем InnoDB. Зато в InnoDB транзакции есть.
С другой стороны, если у вас материала будет тысяч сто, то тогда имеет смысл думать что быстрее, что медленнее.
Правильная расстановка индексов - и будет поиск работать максимум - десятые доли секунды.
REGEXP не обязательно, достаточно LIKE, если просто поиск фразы в тексте.
Я привык все сразу в InnoDB пихать - особых потерь в скорости не терял никогда.
А вот если конкретнее:
Допустим, создаём базу MyISAM:
Код:
В итоге получаем отсортированный список страниц, упорядоченный в порядке релевантности.
Допустим, создаём базу InnoDB:
Код:
CREATE TABLE pages
(id SERIAL,
name VARCHAR(1024),
alter VARCHAR(1024),
text MEDIUMTEXT,
PRIMARY KEY id)
ENGINE InnoDB CHARACTER SET utf8;
[добавляем данные]
SELECT text FROM pages WHERE REGEXP 'поисковый.+запрос';
(id SERIAL,
name VARCHAR(1024),
alter VARCHAR(1024),
text MEDIUMTEXT,
PRIMARY KEY id)
ENGINE InnoDB CHARACTER SET utf8;
[добавляем данные]
SELECT text FROM pages WHERE REGEXP 'поисковый.+запрос';
А в этом случае, наверное, страницы не будут упорядочены согласно релевантности запросу.
Чтобы упорядочить их по релевантности, наверное, придётся дополнительно считать как-то колличество совпавших слов.
Так как же лучше поступить?
Есть задача и есть инструмент для её решения, и тут sphinx самое то. И поставить его на недорогой vds вполне реально ибо я в жизни не поверю, что сумма в ~300-400 руб/мес разорительна.
Цитата:
Что только люди не придумают, лишь бы sphinx не учить
Есть задача и есть инструмент для её решения, и тут sphinx самое то. И поставить его на недорогой vds вполне реально ибо я в жизни не поверю, что сумма в ~300-400 руб/мес разорительна.
Есть задача и есть инструмент для её решения, и тут sphinx самое то. И поставить его на недорогой vds вполне реально ибо я в жизни не поверю, что сумма в ~300-400 руб/мес разорительна.
Virtual dedicated server...
Если б был - может и не проблема.
Но переходить на vds ради того, чтобы использовать sphinx для поиска.
Что-то неохото...