Битва поисковых систем на сайте на основе Elasticsearch

Java задняя часть Elasticsearch поисковый движок

Внутренний поиск можно рассматривать как функцию поиска характерного содержания веб-сайта. Благодаря контролируемому содержанию и формату поиск на сайте намного проще, чем осуществление поиска по всей сети.

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

код находится в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. Простейшая реализация поисковика

Для каждого условия поиска см. заголовок и основной текст каждой статьи для этого условия:

  1. С этим поисковым запросом в заголовке добавьте 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:

  1. Разметьте содержимое поиска, чтобы получить несколько поисковых запросов.
  2. Поиск подборок статей, содержащих поисковый запрос, с помощью инвертированного индекса.
  3. Сходство между каждой статьей в коллекции статей и контентом поиска вычисляется с помощью TF-IDF, косинусного сходства.
  4. Сортируйте по сходству, чтобы получить результаты поиска.

3.1 Окружающая среда Строительство

Сначала создадим среду:

  1. Установите Яву.
  2. Загрузите последнюю версию 6.0.0 с официального сайта и разархивируйте ее.
  3. Установите плагин сегментации 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%, такая оптимизация не нужна.
  2. На какой порядок улучшится скорость поиска?Если она увеличилась всего на 1%, это не очень убедительно.

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

Я предпочитаю не включать стоп-слова в базовом индексе, а выполнять необходимую обработку стоп-слов на бизнес-уровне в соответствии с бизнес-требованиями.

4.2 Предотвращение глубокого поиска

Для Elasticsearch требуется много времени, чтобы вернуть данные с 10001-го по 10010-е в результатах поиска, потому что Elasticsearch должен сначала получить первые 10010 данных с наивысшим баллом, а затем извлечь из них данные с 10001-го по 10010-е.

Интерфейс поиска, воспринимаемый пользователями, разбит на страницы, и каждая страница имеет фиксированный объем данных (например, 10 элементов).Переходят ли пользователи к результатам поиска на странице 1001? Нет. Имеют ли смысл результаты поиска на странице 1001? Это не имеет смысла, и пользователи должны изменить условия поиска.

В заключение, количество результатов поиска, которые получают пользователи, должно быть ограничено.

4.3 Обработка массивных данных

Данные для примера в этой статье состоят из всех статей пользователя, и объем данных невелик. Если весь поиск по сайту Цзяньшу также использует Elasticsearch, сможет ли он с этим справиться?

Фактически, Elasticsearch поддерживает сегментирование и распределенное развертывание и может обрабатывать огромные объемы данных почти в режиме реального времени. Обратите внимание, что индексация может занять много времени, но поиск выполняется быстро.

4.4 Как добавить рекламный контент в результаты поиска

Сам рекламный контент также может быть проиндексирован Elasticsearch и вставлен в результаты поиска в зависимости от ситуации.

Эта статья была опубликована вЗаметки разработчиков Rakuten — самородки, также опубликовано вЗаметки о Ракутене.