[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Поисковик для сайта.
LRCenter
Хотел прояснить для себя несколько моментов. Понимаю что есть куча готовых решений, но ведь всегда интересно построить свой модифицированный велосипед. Так был изобретен мопед biggrin.gif
---

Итак:
1. Поиск по предварительно проиндексированной базе или "поиск на лету"?
1.1.Поиск по индексу:
+Меньшая ресурсоемкость и большая скорость при поиске(чем больше пространство данных по которым проводится поиск, тем ощутимее выигрыш)
+Все плюсы универсальности вытекающие из рекурсивной индексации в случае ее использования (см. п 2.2.)

-необходимость регулярно проводить индексацию (доиндексацию, актуализацию фрагментов индекса, полную переиндексацию.
-Гораздо БОльшая нагрузка на вычислительные мощности сервера, при разовом индексировании чем при разовом "Поиске на лету".
-Необходимость написания такого сложного компонента как "паук" или индексатор.
-Необходимость в доп. дисковом пространстве для хранения индекса.

1.2. "поиск на лету":
+Проще код, не нужно писать "паука"
+Не нужно заботится об индексировании
+Отсутствие большой разовой нагрузки в виде индексирования
+Любые изменения содержимого страниц, тут же будут доступны через поиск.

- БOльшая нагрузка на мощности сервера при разовом поиске (особенно актуально при поиску по большому объему плохо структурированных данных).
- Как следствие плохая масштабируемость решения.
- При организации морфологического поиска, дополнительное увеличение времени поиска и нагрузки в связи с обработкой корней морфем, и подключением словарей (при индексации подключение разовое)
---
Короче, я принимая во внимание все вышесказанное, я решил остановиться на поиске с прединдексацией.
---
2. Выбор стратегии индексации. Индексировать по базе? Или по страницам сайта, передвигаясь по линкам (т.н. рекурсивный поиск)?

Каждый из вариантов имеет свои достоинства и недостатки. Дополните, может я чего-то не понимаю.

2.1.Индексация по базе:
+Относительно малая ресурсоемкость
+Относительно высокая скорость индексации
+Меньший объем кода паука

-Не универсален при подключении индексации контента хранящегося не в базе, контента хранящегося в другой БД, стороннего контента, модулей отличающейся архитектурой хранения данных
--------
2.2.Рекурсивная индексация:
+Абсолютная универсальность. Индексируется все и вся связанное линками в пределах заданного URL.
+Возможность индексировать внешние ресурсы, и несколько ресурсов разом, независимо от архитектуры хранения данных.


-Относительно более высокая ресурсоемкость
-Относительно низкая скорость индексирования
-Более сложный и объемный код индексатора
---
Вот тут серьезная диллема. Склоняюсь к рекурсивному поиску. Что скажите?

_____________
Меньше кода - меньше багов ©
Игорь_Vasinsky
я б выбрал базу....

а
Цитата
-Более сложный и объемный код индексатора


действительно.



_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
LRCenter
Раз никто больше не хочет ничего сказать по поводу выбора идеологии, задам пару вопросов по поводу алгоритма и его оптимальности. Жаль тут нет инструментов для рисования блок-схем smile.gif

1. Захватываем содержимое начальной страницы функцией file_get_contents()
2. Записываем в ячейку бд url индексируемой страницы
3. Вычленяем регулярным выражением заголовок страницы (<title></title>), записываем его в следующую ячейку (если он есть, если же нет то берем первое предложение индексируемого текста)
4. Определяем и записываем в следующую ячейку размер страницы в байтах - пригодится)
5. Очищаем данные от html-разметки и js-кода.
6. Записываем очищенные данные в следующую ячейку.
7. Захватываем регулярками все ссылки из исходных, не очищеной страницы.
8. Убираем все ссылки в которые не начинаются с нужных нам url-ов
9. Убираем все ссылки кроме тех которые ведут на страницы
10.Читаем список url-ов уже проиндексированных(если такой есть)
11.Сравниваем два списка и удаляем из списка проиндексированные
12.Читаем список url-ов ожидающих индексации(если такой есть)
13.Сравниваем два списка и удаляем из оперативного списка данные если они есть в общем
14.Если в списке еще что-то осталось дописываем его в общий список страниц ожидающих индексации.
15.Дописываем url-текущей страницы в список проиндексированных.
16.Повторяем цикл используя список ожидающих индексации или останавливаем его если он пуст.

---
Это, так сказать, голый скелет.
Можно еще много чего прикрутить, например: запись даты, актуализация(доиндексация без перезаписи старых), индекcация блоками(по кол-ву страниц) с паузами(для равномерного распределения нагрузки), автоматизация запуска и т.п.


Ну как вам в целом? Что можно оптимизировать?

_____________
Меньше кода - меньше багов ©
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.