Внутренний поиск можно рассматривать как функцию поиска характерного содержания веб-сайта. Благодаря контролируемому содержанию и формату поиск на сайте намного проще, чем осуществление поиска по всей сети.
короткая книгаЭтот веб-сайт сам по себе имеет поиск, но ему не хватает поиска по личным статьям, поэтому фактическое содержание этой статьи должно решить эту проблему.
код находится вGitHub.com/Ле Тиан/…, вы можете использовать следующие методы для загрузки кода для просмотра:
git clone https://github.com/letiantian/jianshu-site-search.git
Код работает под Python 2.7. Необходимо установить следующие зависимости:
pip install elasticsearch==6.0.0 --user
pip install uniout --user
pip install requests --user
pip install beautifulsoup4 --user
pip install Django --user
1. Источник данных
Если Цзяньшу выполняет личный поиск для себя, просто возьмите его из базы данных.
В моем случае я естественно хватаю его обходчиком.
1.1 Что сканируется?
Просканируйте все статьи человека и в итоге получитеURL
,标题
,正文
три части.
1.2 Как ползать?
отwoohoo.brief.com/u/7share2oh7baby7…Эта (случайно найденная) домашняя страница пользователя является примером.7fe2e7bb7d47
Его можно рассматривать как идентификатор этого пользователя.
Адрес статьи аналогиченhttp://www.jianshu.com/p/9c2fdb9fa5d1
,9c2fdb9fa5d1
это идентификатор статьи.
После анализа может быть запрошен следующий адрес, из него можно разобрать адрес статьи и получить набор адресов:
http://www.jianshu.com/u/7fe2e7bb7d47?order_by=shared_at&page=1
http://www.jianshu.com/u/7fe2e7bb7d47?order_by=shared_at&page=2
http://www.jianshu.com/u/7fe2e7bb7d47?order_by=shared_at&page=3
// ... page的值不断增加
// ... 当page不存在的时候,简书会返回page=1的内容,这时候停止抓取
Затем по очереди возьмите содержимое статьи и сохраните его.
crawler.pyДля сканирования статей используйте метод:
python crawler.py 7fe2e7bb7d47
Веб-страница, соответствующая статье, будет сохранена вdata
Каталог, названный по идентификатору статьи.
2. Простейшая реализация поисковика
Для каждого условия поиска см. заголовок и основной текст каждой статьи для этого условия:
- С этим поисковым запросом в заголовке добавьте 2 балла к статье.
- Если в тексте есть поисковый запрос, добавьте 1 балл к статье.
Чем больше поисковых запросов попадает в статью, тем выше оценка.
Результаты можно сортировать и выводить.
Код реализован вsimple_search.py,Инструкции:
$ python simple_search.py 人民 名义
你输入了: 人民 名义
搜索结果:
url: http://www.jianshu.com/p/6659d5fc5503
title: 《人民的名义》走红的背后 文化产业投资难以言说的痛
score: 6
url: http://www.jianshu.com/p/ee594ea42815
title: LP由《人民的名义》反思 GP投资权力真空怎么破
score: 6
url: http://www.jianshu.com/p/4ef650769f73
title: 弘道资本:投资人人贷、ofo 人民币基金逆袭的中国样本
score: 3
Недостатками этого подхода являются:
- Поскольку он просматривает каждую статью, скорость будет снижаться, когда статей будет больше.
- Результаты поиска плохо сортируются
- Функция сегментации китайских слов не введена
3. Реализация на основе Elasticsearch
Elasticsearch — это универсальное решение для поисковой системы с элегантным интерфейсом HTTP Restful и богатой официальной документацией. Руан Ифэн написал для него краткое и понятное руководство:Руководство по началу работы с полнотекстовой поисковой системой Elasticsearch, рекомендуется к прочтению.
Основные принципы Elasticsearch:
- Разметьте содержимое поиска, чтобы получить несколько поисковых запросов.
- Поиск подборок статей, содержащих поисковый запрос, с помощью инвертированного индекса.
- Сходство между каждой статьей в коллекции статей и контентом поиска вычисляется с помощью TF-IDF, косинусного сходства.
- Сортируйте по сходству, чтобы получить результаты поиска.
3.1 Окружающая среда Строительство
Сначала создадим среду:
- Установите Яву.
- Загрузите последнюю версию 6.0.0 с официального сайта и разархивируйте ее.
- Установите плагин сегментации ik word.
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.0.0/elasticsearch-analysis-ik-6.0.0.zip
Или загрузите и разархивируйте его в каталог плагинов Elasticsearch. 4. Старт:
./bin/elasticsearch
Настройка среды завершена.
3.2 Создайте индекс
python es_create_index.py
Токенизатор указывается при создании.
3.3 Индексные данные
python es_index_data.py
Чтобы статья не индексировалась повторно, идентификатор документа устанавливается равным идентификатору статьи при добавлении указателя.
3.4 Поиск
python es_search.py 人民的名义
Выделите результаты поиска:
python es_hl_search.py 人民的名义
3.5 Поиск в Интернете
Реализован простой веб-интерфейс на основе Django. бегать:
python webui/manage.py runserver
доступ через браузерhttp://127.0.0.1:8000/
Вот и все. Эффект опыта:
4. Некоторые мысли об Elasticsearch
4.1 Как обрабатывать стоп-слова?
Стоп-слова — это очень распространенные слова, такие как的
,the
Ждать. Обычное использование заключается в удалении стоп-слов после токенизации, а затем в индексировании. Распространенным оправданием такой практики является уменьшение размера индекса. В то же время, теоретически, скорость поиска также может быть повышена.
Соответственно, здесь можно обсудить два вопроса:
- На какой порядок уменьшается размер индекса, если это всего лишь уменьшение на 1%, такая оптимизация не нужна.
- На какой порядок улучшится скорость поиска?Если она увеличилась всего на 1%, это не очень убедительно.
Может ли он удовлетворить потребности бизнеса, является целью. Если вам нужно искать的
Когда есть результат при употреблении этого слова, то вышеописанный подход неразумен.
Я предпочитаю не включать стоп-слова в базовом индексе, а выполнять необходимую обработку стоп-слов на бизнес-уровне в соответствии с бизнес-требованиями.
4.2 Предотвращение глубокого поиска
Для Elasticsearch требуется много времени, чтобы вернуть данные с 10001-го по 10010-е в результатах поиска, потому что Elasticsearch должен сначала получить первые 10010 данных с наивысшим баллом, а затем извлечь из них данные с 10001-го по 10010-е.
Интерфейс поиска, воспринимаемый пользователями, разбит на страницы, и каждая страница имеет фиксированный объем данных (например, 10 элементов).Переходят ли пользователи к результатам поиска на странице 1001? Нет. Имеют ли смысл результаты поиска на странице 1001? Это не имеет смысла, и пользователи должны изменить условия поиска.
В заключение, количество результатов поиска, которые получают пользователи, должно быть ограничено.
4.3 Обработка массивных данных
Данные для примера в этой статье состоят из всех статей пользователя, и объем данных невелик. Если весь поиск по сайту Цзяньшу также использует Elasticsearch, сможет ли он с этим справиться?
Фактически, Elasticsearch поддерживает сегментирование и распределенное развертывание и может обрабатывать огромные объемы данных почти в режиме реального времени. Обратите внимание, что индексация может занять много времени, но поиск выполняется быстро.
4.4 Как добавить рекламный контент в результаты поиска
Сам рекламный контент также может быть проиндексирован Elasticsearch и вставлен в результаты поиска в зависимости от ситуации.
Эта статья была опубликована вЗаметки разработчиков Rakuten — самородки, также опубликовано вЗаметки о Ракутене.