Как подключить elasticsearch к сайту

Изучаем ELK. Часть I — Установка Elasticsearch

Как подключить elasticsearch к сайту

Вступительное слово

Эта статья является первой в серии статей по стеку Elasticsearch, Logstash, Kibana (ELK). Цикл статей ориентирован на тех, кто только начинает знакомится со стеком ELK, и содержит минимально необходимый набор знаний, чтобы успешно запустить свой первый кластер ELK.

В рамках данного цикла будут рассмотрены такие темы, как:

установка и настройка компонентов ELK,

безопасность кластера, репликация данных и шардирование,

конфигурирование Logstash и Beat для сборки и отправки данных в Elasticsearch,

визуализация в Kibana

запуск стека в Docker.

В данной статье будет рассмотрена процедура установки Elasticsearch и конфигурирование кластера.

План действий:

Скачиваем и устанавливаем Elasticsearch.

Запускаем и проверяем работоспособность кластера.

Делаем важные настройки.

Скачиваем и устанавливаем Elasticsearch

Существует множество вариантов установки Elasticsearch, под любые нужды и желания. С перечнем можно ознакомится на официальном сайте. Не смотря на то, что на своем стенде я использовал установку из Deb пакетов, считаю правильным так же описать установку из RPM пакетов и архива tar.gz для Linux системы.

Установка из Deb пакетов

Импортируем Elasticsearch PGP ключ:

Устанавливаем apt-transport-https пакет:

Перед установкой пакета необходимо добавить репозиторий Elastic:

Устанавливаем Elasticsearch из пакета:

Настраиваем Elasticsearch для автоматического запуска при запуске системы:

Установка из RPM пакетов

Импортируем Elasticsearch PGP ключ:

В директории /etc/yum.repos.d/ создаем файл репозитория Elasticsearch elasticsearch.repo :

Установка из архива tar.gz

Скачиваем архив с Elasticsearch

Извлекаем данные из архива и переходим в каталог с Elasticsearch:

На этом шаге установка из архива считается завершенной.

Для запуска Elasticsearch можно создать отдельного пользователя, предоставив все необходимые права к каталогу с Elasticsearch и указывая данного пользователя при настройке файловых дескрипторов.

Настраиваем кластер

На текущем этапе у нас есть три хоста с установленным Elasticsearch. Следующим и самым важным этапом является настройка каждого узла для объединения их в единый кластер.

Ниже будут приведены пример конфигурации для узла es-node01. Аналогичные настройки необходимо сделать на каждом узле, указав соответствующие имя и адрес.

Указываем имя узла и определяем роли. Укажем для узла роли master и data :

master Данная роль дает возможность узлу быть избранным, как управляющий узел кластера

data узел с данной ролью содержит данные и выполняет операции с этими данными

Со списком всех ролей узла можно ознакомится тут.

Настраиваем адрес и порт, на которых узел будет принимать запросы:

Определяем имя кластера и начальный список узлов в голосовании по выбору master узла:

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

Данный параметр следует удалить после создания кластера и не использовать при добавлении новых узлов в существующий кластер.

Указываем список master узлов кластера:

Определяем, где будем хранить данные и логи

На выходе мы должны получить следующий конфигурационный файл:

При необходимости настраиваем межсетевой экран на хосте:

Запускаем и проверяем

Запускаем на каждом узле службу elasticsearch :

Для установки из архива используем:

или если мы хотим запустить Elasticsearch как демон, то:

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

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

Проверяем состояние кластера, обратившись к любому его узлу:

Делаем важные настройки

Для нормальной работы кластера необходимо произвести еще некоторые настройки.

Heap size

Отключаем подкачку

Подкачка негативно сказывается на производительности и стабильности работы Elasticsearch, ведь система может выгрузить страницы JVM на диск. Есть несколько вариантов работы с подкачкой:

Полное отключение подкачки. Перезапуск Elasticseach при этом не требуется.

Использование mlockall для блокировки адресного пространства в оперативной памяти.

Перезапускаем Elasticsearch и проверяем настройки через запрос к любому узлу:

Если перезапуск Elasticsearch завершился ошибкой вида:

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

Установка из архива

Установка из пакета RPM или Deb

и укажите следующее значение:

Настройка файловых дескрипторов

Elasticsearch работает с большим количеством файловых дескрипторов, и их нехватка может катастрофически сказаться на его работе. Согласно официальной документации необходимо указать значение файловых дескрипторов не ниже 65 536.

Если Elasticsearch установлен из RPM или Deb пакетов, то настройка не требуется.

Для установки из архива необходимо в файле /etc/security/limits.conf установить параметр nofile для пользователя, который осуществляет запуск Elasticsearch. В примере ниже таким пользователем является elasticsearch :

Проверить установленные значения можно следующим образом:

Настройка виртуальной памяти

Elasticsearch по умолчанию использует каталог mmapfs для хранения индексов, и ограничение операционной системы по умолчанию для счетчиков mmap может привести к нехватки памяти. Для настройки запустите из-под root следующую команду:

Если Elasticsearch установлен из RPM или Deb пакетов, то настройка не требуется.

Настройка потоков

Необходимо убедиться, что количество потоков, которые Elasticsearch может создавать, было не менее 4096.

DNS кеширование

Временный каталог для JNA

На этом шаге дополнительные настройки Elasticsearch окончены.

Заключение

Дойдя до этого места, вы должны иметь работоспособный кластер Elasticsearch.

В следующей статье будут описаны процедуры установки и настройки Kibana и Logstash. А в качестве проверки работоспособности кластера соберём данные из файла и посмотрим на них с помощью Kibana.

Источник

ElasticSearch: что такое, как работать и где применять

Как раз, ElasticSeach удовлетворяет нас по этим 2 показателям, плюс, он имеет ещё много дополнительных функций и возможностей для того, чтобы сделать нашу жизнь ещё проще.

Что такое Elasticsearch и как он работает

MySQLБазы дынныхТаблицыСтроки/Колонки
ElasticsearchИндексыТипыДокументы со свойствами

Для того, чтобы установить Elasticsearch, рекомендую просмотреть эту статью, в которой были рассмотрены примеры установки на все операционные системы (в том числе, Docker и Homestead Vagrant).

Базовые понятия

Перед началом, хотелось бы рассмотреть подробнее, важные определения.

Фрагмент (Shard)
Elasticsearch поддерживает возможность разделять индексы на фрагменты ( shards ). Каждый из них является полнофункциональным и независимым «индексом», который может быть частью узла внутри кластера. Это полезно, в случаях, когда индекс добавляется в один узел, который не будет занимать больше места, чем ему доступно. Индекс тогда разделяется между несколькими различными узлами. Кроме того, shards позволяют распределять и выполнять параллельные операции между этими фрагментами, повышая при этом производительность.

Какие способы внедрения Elasticsearch в свой проект

При внедрении Elasticsearch в свой проект, существует несколько способов:

Как говорится на их сайте, чем больше ОЗУ, тем лучше работает Elasticsearch.

Добавление документа

Перед тем, как мы разработаем простое PHP-приложение, которое будет взаимодействовать с Elasticsearch, я покажу как добавлять документы в индекс, просто используя REST API, выполняя запросы из обычного HTTP-клиента:

В текущем случае, экранирование кавычек в теле запроса \» должно быть, чтобы на сервер отправился валидный JSON.

Адрес, по которому обращаемся, состоит из таких параметров:
Как подключить elasticsearch к сайту

Для демонстрации процесса поиска ниже, добавим ещё несколько записей:

Если вы не используете CURL, а хотите для этого использовать программу Postman, то для этого, нужно настоить удалённый доступ для Elasticsearch и после чего, сможете воспользоваться этим клиентом, указав ему нужные параметры Как подключить elasticsearch к сайту

Поиск документов

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

Как можете увидеть, все 3 пользователя были успешно добавлены. И, помимо указанных нами полей, Elasticsearch предоставляет информацию о том, сколько времени занял этот запрос (в миллисекундах), и какое количество результатов было получено, и дополнительные поля документа: индекс, тип и идентификатор.

Подключение и настройка ElasticSearch с PHP

Во второй части той статьи мы рассмотрим пример работы с Elasticsearch из PHP. В результате чего, напишем простой скрипт по добавлению данных в индекс из PHP, и их поиск.

Дальше, вызываем метод поиска, передав нужные параметры:

После чего, пройдёмся по полученному массиву данных, и создадим на его основе свой, содержащий только нужные нам данные:

И, после, можем распечатать результаты в HTML-шаблоне:

В итоге, получился такой результат:
Как подключить elasticsearch к сайту

Резюме

В этой статье я рассказал, что такое Elasticsearch, написал небольшой гайд по работе с ним, для чего он нужен, как делать индексы в elasticsearch, описал его базовые понятия и термины для чайников. Так же, показал, как работать с Elasticsearch из PHP, как добавлять документы, искать их, продемонстрировав примеры запросов, и как они строятся. А так, же, как обрабатывать ответ от Elasticsearch в PHP, как делать поиск.
Дальше будут более продвинутые примеры, агрегации, настройка анализаторов, работа с Laravel, массивами, связями и т.д.
А пока что, советую детальнее изучить документация.

Subscribe to Блог php программиста: статьи по PHP, JavaScript, MySql

Get the latest posts delivered right to your inbox

Источник

Русские Блоги

Глава 5 Введение и установка Elasticsearch

5.1 Введение

5.1.1 Elastic

Официальный сайт Elastic: https://www.elastic.co/cn/

[Не удалось передать изображение по внешней ссылке, исходный сайт может иметь механизм защиты от похищения, рекомендуется сохранить изображение и загрузить его напрямую (img-jv3c8Hwg-1584342573894) (mdpic / 1528546351055.png)]

Elastic предлагает полную линейку продуктов и решений: Elasticsearch, Kibana, Logstash и т. Д. Три упомянутых выше стека технологий ELK, о которых все часто говорят.
Как подключить elasticsearch к сайту

5.1.2.Elasticsearch

Официальный сайт Elasticsearch: https://www.elastic.co/cn/products/elasticsearch
Как подключить elasticsearch к сайту

5.1.3. Версия

Требуется виртуальная машина JDK1.8 и выше

5.2 Установка и настройка

Чтобы смоделировать реальный сценарий, мы установим Elasticsearch под Linux.

5.2.1. Создайте нового пользователя es

По соображениям безопасности elasticsearch не может запускаться от имени пользователя root по умолчанию.

5.2.2. Загрузите установочный пакет и разархивируйте

Загружаем установочный пакет в каталог: / home / es

5.2.3. Изменить конфигурацию

Входим в директорию config: cd config

Необходимо изменить два файла конфигурации: elasticsearch.yml и jvm.options.

Elasticsearch основан на Lucene, а нижний уровень Lucene реализован на Java, поэтому нам нужно настроить параметры jvm.

Конфигурация по умолчанию следующая:

Мы изменили каталоги данных и журналов, чтобы они указывали на каталог установки elasticsearch. Но этих двух каталогов не существует, поэтому нам нужно их создать.

Перейдите в корневой каталог elasticsearch и создайте:

По умолчанию разрешен только локальный доступ, после изменения на 0.0.0.0 возможен удаленный доступ

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

Другая настраиваемая информация elasticsearch.yml:

5.3 Эксплуатация

Войдите в каталог elasticsearch / bin, вы увидите следующие исполняемые файлы:

Затем введите команду:

Обнаружено, что сообщается об ошибке и запуск не удался.

5.3.1 Ошибка 1: ядро ​​слишком мало

[Не удалось передать изображение по внешней ссылке. На исходном сайте может быть механизм ссылки, предотвращающий пиявку. Рекомендуется сохранить изображение и загрузить его напрямую (img-hEfdofMh-1584342573897) (mdpic / 1558339701613.jpg)]

Измените файл elasticsearch.yml и добавьте следующую конфигурацию внизу:

5.3.2 Ошибка 2: недостаточные права доступа к файлу

Запустился снова, произошла еще одна ошибка:
Как подключить elasticsearch к сайту
Мы используем пользователя es вместо root, поэтому прав доступа к файлу недостаточно.

Сначала войдите в систему как пользователь root.

Затем измените файл конфигурации:

Добавьте следующий контент:

5.3.3 Ошибка 3: недостаточно потоков

В отчете об ошибке есть еще одна строка:

На это не хватает тем.

Продолжайте изменять конфигурацию:

Измените следующее содержимое:

5.3.4 Ошибка 4: Виртуальная память процесса

vm.max_map_count: ограничить количество VMA (области виртуальной памяти), которое может иметь процесс, продолжить изменение файла конфигурации:

Добавьте следующий контент:

Затем выполните команду:

5.3.5 Перезапустить окно терминала

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

5.3.6 Пуск

Начать заново и наконец-то удалось!
Как подключить elasticsearch к сайту

Вы можете видеть, что два порта связаны:

Заходим в браузере: http://192.168.82.193:9200
Как подключить elasticsearch к сайту

54. Установите кибану.

5.4.1 Что такое кибана?

Как подключить elasticsearch к сайту

Он также предоставляет консоль для работы с данными индекса Elasticsearch и предоставляет определенные советы по API, которые очень полезны для изучения синтаксиса Elasticsearch.

5.4.2 Установка

Версия kibana совместима с elasticsearch, и это также 6.5.4, чтобы распаковать ее в определенный каталог.

5.4.3 Запуск конфигурации

Войдите в каталог config в каталоге установки и измените файл kibana.yml:

Измените адрес сервера elasticsearch:

Для запуска введите каталог bin в каталоге установки:

Как подключить elasticsearch к сайту

Заходим: http://193.168.82.193:5601
Как подключить elasticsearch к сайту

5.4.4 Консоль

Выберите меню DevTools слева, чтобы перейти на страницу консоли:
Как подключить elasticsearch к сайту

В правой части страницы мы можем ввести запрос на доступ к Elasticsearch.
Как подключить elasticsearch к сайту

5.5 Установите ik tokenizer

IK-токенизатор Lucene не поддерживался еще в 2012 году. Теперь мы собираемся использовать обновленную версию, основанную на нем, и он был разработан как интегрированный плагин для ElasticSearch. Он поддерживается и обновляется вместе с Elasticsearch. Версия также согласована, последняя Версия: 6.3.0

5.5.1. Установка

Загрузите zip-пакет в материалы предварительного курса и распакуйте его в каталог плагинов каталога Elasticsearch:

Используйте команду unzip для распаковки:

Затем перезапустите elasticsearch:

[Не удалось передать изображение по внешней ссылке. На исходном сайте может быть механизм ссылки, предотвращающий пиявку. Рекомендуется сохранить изображение и загрузить его напрямую (img-tRWoOxVR-1584342573903) (mdpic / 1558340588420.jpg)]

5.5.2. Тест

Независимо от грамматики, давайте сначала проверим это.

В консоли кибаны введите следующий запрос:

Беги за результатом:
Как подключить elasticsearch к сайту

Источник

Учимся работать с Elasticsearch

Как подключить elasticsearch к сайту

Содержание статьи

Основных поисковых брендов на данный момент существует несколько: это Solr, Sphinx, Elasticsearch. Но сегодня мы поговорим только о последнем. Elasticsearch — это на самом деле не вполне самостоятельный поиск. Это, скорее, красивая обертка над библиотекой Apache Lucene (на нем же строится Solr). Но не стоит воспринимать слово «обертка» в негативном ключе. Lucene сам по себе вообще мало на что годен. Это все-таки не полноценный сервис, а просто библиотека для построения поисковых систем. Все, что она может, — только индексировать и искать. А API для ввода данных, для поисковых запросов, кластеризация и прочее — это все отдается на откуп «обертке».

Что нам дает Elasticsearch?

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

На самом деле оно даже работает. В хипстерском стиле «чувак, вот тебе три команды — пользуйся ими и, пожалуйста, не задумывайся, какой ад происходит внутри». И часто это прокатывает. Новые ноды подключаются буквально парой строчек в конфиге, почти как у Redis. Главное, мастеры со слейвами не путать, а то он возьмет и молча потрет все данные :). При выпадении каких-либо серверов из кластера, если правильно были распределены реплики данных, корректно настроенное приложение продолжит поиск, как будто ничего не произошло. После того как сервер поднимется, он сам вернется в кластер и подтянет последние изменения в данных.

Мультиарендность (англ. multitenancy) — возможность организовать несколько различных поисковых систем в рамках одного объекта Elasticsearch. Причем организовать их можно абсолютно динамически. Очень интересная особенность, которая в отдельных случаях становится определяющей при выборе поисковой системы. На первый взгляд может показаться, что необходимости в этой особенности нет. Классические системы поиска типа Sphinx обычно индексируют какую-то одну базу с определенным кругом данных. Это форумы, интернет-магазины, чаты, различные каталоги. Все те места, где поиск для всех посетителей должен быть идентичным. Но на самом деле довольно часто возникают ситуации, когда систем поиска должно быть больше одной. Это либо мультиязычные системы, либо системы, где есть определенное количество пользователей, которым нужно предоставлять возможность поиска по их персональным данным.

В первом случае нам нужно строить отдельные индексы по разным языкам, отдельно настраивать морфологию, стемминг, параметры нечеткого поиска для того, чтобы получить максимально качественные результаты для каждого из языков. Во втором случае в качестве гипотетического примера можно взять какой-нибудь корпоративный аналог Dropbox’а. Приходит клиент, регистрируется, заливает свои документы. Система их анализирует, угадывает язык, парсит, заливает в отдельный индекс поисковой системы, настраивает параметры под нужный язык. И далее клиент может пользоваться поиском по своим документам. Поиск будет работать достаточно быстро, потому что данных в индексе отдельного клиента всегда будет меньше, чем в одном большом общем, будет возможность динамически такие индексы создавать, устанавливать различные поисковые параметры. Ну и данные клиентов будут изолированы друг от друга.

Операционная стабильность — на каждое изменение данных в хранилище ведется логирование сразу на нескольких ячейках кластера для повышения отказоустойчивости и сохранности данных в случае разного рода сбоев.

Отсутствие схемы (schema-free) — Elasticsearch позволяет загружать в него обычный JSON-объект, а далее он уже сам все проиндексирует, добавит в базу поиска. Позволяет не заморачиваться слишком сильно над структурой данных при быстром прототипировании.

RESTful api — Elasticsearch практически полностью управляется по HTTP с помощью запросов в формате JSON.

Краткий словарик начинающего гуманитария

Установка и использование

Установить Elasticsearch проще простого. Есть готовые репозитории и для RHEL/Centos, и для Debian. Можно отдельно установить из тарбола.

Хакер #196. Все о Docker

И вся дальнейшая работа с ним происходит посредством HTTP-запросов в JSON-формате. Давай, к примеру, создадим новый индекс и забьем в него какие-нибудь тестовые данные. Я взял отсюда англо-русский параллельный корпус, собранный из данных OpenSubtitles.org. Формат TMX достаточно простой, описывать его отдельно не стану. Напишу небольшой парсер на Python, который бы разбирал файл и заливал данные в новый индекс:

На VPS’ке с четырьмя гигами памяти во флопсе заливка четырех с половиной миллионов документов (чуть больше 900 Мб данных в текстовом формате) занимает примерно полтора часа. В целом очень даже неплохо. Теперь накидаем небольшой скриптик для удобного поиска:

И проверяем, что у нас получилось:

Первая колонка — вес полученного значения, остальные две — найденные результаты. А теперь ищем по-русски:

Как видишь, неплохо ищет уже прямо из коробки, для какого-нибудь блога или небольшого форума вполне подойдет. А если качество выдачи покажется недостаточно высоким (а к такой мысли рано или поздно приходят почти все), то Elasticsearch предоставляет большое количество возможностей для дальнейшего тюнинга анализаторов и поисковых алгоритмов.

Анализаторы

Выбор правильного анализатора для обработки своих данных — это что-то почти на грани искусства. Изнутри каждый анализатор представляет собой своеобразный конвейер, состоящий из нескольких обработчиков:

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

Как подключить elasticsearch к сайту Конвейер анализатора

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

Elasticsearch из коробки предоставляет сразу несколько различных анализаторов. Если их будет мало, то нестандартные анализаторы можно будет добавить с помощью специального API. Вот базовый пример нестандартного анализатора:

Что делает этот анализатор:

И смотри, как это выглядит на живом примере. Возьмем предложение «Мама мыла раму, пока собака доедала сосиску» и разберем его по пунктам (рис. «Мама мыла-мыла. »).

Детальнее о предоставляемых вместе с Elasticsearch анализаторах и фильтрах можно прочитать в официальной документации. Здесь описывать не возьмусь, так как деталей там очень много.

Нечеткий поиск

Обработка естественных языков — это работа с постоянными неточностями. По большей части поисковые движки пытаются анализировать грамматические структуры различных языков, осваивать определенные паттерны, характерные для того или иного языка. Но поисковая система постоянно сталкивается с запросами, выходящими за рамки устоявшихся правил орфографии и морфологии. Чаще всего это либо опечатки, либо банальная безграмотность. Самый простой пример нечеткого поиска — это знаменитое «Возможно, Вы имели в виду. » в Гугле. Когда человек ищет «пгода вИ кутске», а ему показывают погоду в Иркутске.

Основой нечеткого поиска является расстояние Дамерау — Левенштейна — количество операций вставки/удаления/замены/транспозиции для того, чтобы одна строка совпала с другой. Например, для превращения «пгода вИ кутске» в «погода в Иркутске» такое расстояние было бы равно трем — две вставки и одна замена.

Расстояние Дамерау — Левенштейна — это модификация классической формулы Левенштейна, в которой изначально отсутствовала операция транспозиции (перестановки двух соседних символов). Elasticsearch поддерживает возможность использования в нечетком поиске обоих вариантов, по умолчанию включено использование расстояния Дамерау — Левенштейна.

При работе с нечетким поиском также не стоит забывать и о том, как Elasticsearch (да и любой другой поисковый движок в принципе) работает изнутри. Все данные, загружаемые в индекс, сперва проходят обработку анализатором, лемматизацию, стемминг. В индекс уже складываются только «обрывки» исходных данных, содержащие максимум смысла при минимуме знакового объема. И уже по этим самым обрывкам впоследствии проводится поиск, что при использовании нечеткого поиска может давать довольно курьезные результаты.

Например, при использовании анализатора snowball во время нечеткого поиска по слову running оно после прохода через стемминг превратится в run, но при этом по нему не найдется слово runninga, так как для совпадения с ним нужно больше двух правок. Поэтому для повышения качества работы нечеткого поиска лучше использовать самый простой стеммер и отказаться от поиска по синонимам.

Elasticsearch поддерживает несколько различных способов нечеткого поиска:

CJK — это три буквы боли западных систем полнотекстового поиска и людей, которые хотят ими воспользоваться. CJK — это сокращение для Chinese, Japanese, Korean. Три основных восточных языка, составляющих совокупно почти 10% современного интернета. Они отличаются от привычных западных языков практически всем — и письменностью, и морфологией, и синтаксисом. Все это, понятно, вызывает некоторые проблемы при разработке различных систем обработки естественных языков, в том числе и поисковых систем.

У Elasticsearch в этой области дела тоже обстоят неплохо. Есть встроенный анализатор CJK со стеммингом, есть возможность использовать нечеткий поиск. Вот только если по текстам на корейском и японском языках еще хоть как-то можно искать «по классическим правилам» (то есть делим на слова, отбрасываем союзы/предлоги, оставшиеся слова токенизируем и загоняем в индекс), то вот с китайским, в котором слова в предложении не принято разделять пробелами, все куда сложнее.

Для поисковой системы все предложение на китайском остается одной целой единицей, по которым проводится поиск. Например, предложение «Мэри и я гуляем по Пекину» выглядит вот так:

Девять символов без пробелов, 18 байт в UTF-8. В нормальной вселенной это прокатило бы за одно слово, но не тут. Если стратегически расставить пробелы в нужных местах, то предложение станет выглядеть вот так:

Шесть слов. С этим уже можно было бы работать. Вот только пробелы в китайском никто не использует. Можно пытаться разделять предложения на слова в автоматическом режиме (уже даже существует пара готовых решений), но и тут тебя будут ожидать неприятности. Некоторые слоги, стоящие в предложении рядом, могут, в зависимости от того, как их разделить пробелами, складываться в разные слова и резко менять смысл предложения. Возьмем для примера предложение 我想到纽约:

Как видишь, на автоматизированное членение лучше не полагаться. Как тогда быть? Тут нам поможет поиск по N-граммам. Предложение делится на куски по два-три знака:

И уже по ним далее идет поиск. К этому можно добавить нечеткий поиск с расстоянием в одну-две замены, и уже получится более-менее сносный поиск.

Безопасность

У Elasticsearch нет никакой встроенной системы авторизации и ограничения прав доступа. После установки он по умолчанию вешается на порт 9200 на все доступные интерфейсы, что делает возможным не только полностью увести у тебя все, что находится в поисковой базе, но и, чисто теоретически, через обнаруженную дыру залезть в систему и там начудить. До версии 1.2 такая возможность была доступна прямо из коробки (см. CVE-2014-3120) и напрягаться не было вообще никакой нужды. В 1.2 по умолчанию выполнение скриптов в поисковых запросах отключено, но пока что и это не спасает.

Совсем недавно мы наблюдали ботнет на эластиках версий в том числе и 1.4 и выше. Судя по всему, использовалась уязвимость CVE-2015-1427. В версии 1.4.3 ее вроде как закрыли, но, сам понимаешь, полагаться на удачу в таких делах не вариант (на самом деле да, пока писалась эта статья, свежепоставленный эластик версии 1.5.0 на тестовых виртуалках у меня успели поломать уже на второй день :)). Вешай сервис только на локальные IP, все необходимые подключения извне ограничивай только доверенными адресами, фильтруй поисковые запросы, своевременно обновляйся. Спасение утопающих — дело рук самих утопающих.

К теме сохранности данных также стоит упомянуть про бэкапы. Возможности резервного копирования и восстановления встроены в сам Elasticsearch, причем довольно интересно. Перед началом создания резервных копий нужно эластику сообщить, куда они будут складываться. В местных терминах это называется «создать репозиторий»:

После того как создан репозиторий, можно начать бэкапиться:

Такой запрос создает бэкап с названием snapshot_1 в репозитории my_backup.

Восстановить данные можно следующим образом:

Причем снимки состояния делаются инкрементальные. То есть в первый раз создается полный бэкап, а далее при последующих бэкапах фиксируется только разница состояния между текущим моментом и моментом предыдущего бэкапа. Если у тебя кластер с несколькими мастерами, то хранилище репозитория должно шариться между всеми мастерами (то есть, при хранении на файловой системе, это должен быть какого-либо рода сетевой диск, доступный всем мастерам). Файлы репозитория я бы тоже с диска куда-нибудь бэкапил на всякий случай :).

Эпилог

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *