НАЧАЛО РАБОТЫ - УПРУГОЙ ПОИСК

Привет, мир,

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

  1. протоколирование
  2. Мониторинг и визуализация показателей вашей системы
  3. Карты - исследуйте данные о местоположении в режиме реального времени.
  4. Поиск приложений - поиск по данным.
  5. Uptime- мониторинг и реагирование на проблемы с доступностью.

Elasticsearch работает на Lucene (высокопроизводительной библиотеке текстового поиска). Это один из немногих продуктов от elastic, в котором есть такие продукты, как kibana, logstash и многие другие. Вы можете посетить https://www.elastic.co/ для получения дополнительной информации об их ассортименте.

Несколько замечательных моментов по поводу elasticsearch:

  1. Это открытый исходный код
  2. Использует apache Lucene
  3. Распространяется по природе - в масштабе тысяч узлов
  4. Высокая доступность - поддерживается несколько копий данных
  5. Rest API- CRUD, мониторинг через HTTP-вызовы JSON, которые довольно просты в использовании
  6. Мощный DSL запросов (язык, специфичный для домена)
  7. Schemaless
  8. Поиск в реальном времени - низкая задержка ~ 1 сек.

Elasticsearch - это база данных NoSQL, которая хранит ваши данные в документах. Затем документы сохраняются в индексах, которые вы создаете в узле. Elasticsearch предлагает поддержку почти для всех распространенных языков, таких как java, golang, python, ruby, perl, JS и т. Д. В этой статье мы будем использовать curl для сохранения нейтральности языка.

А теперь давайте поговорим об эластичном жаргоне.

  1. Узел - отдельный сервер в кластере называется узлом.
  2. Кластер - набор узлов. Содержит все проиндексированные данные и имеет уникальное имя. Узлы присоединяются к кластеру, указывая имя кластера.
  3. Документ - основная единица информации для индексации. Он выражается в JSON и находится в индексе. Документы делятся на категории или типы. Все эти типы документов составляют указатель. Например, у каждого пользователя будет документ, в котором будет храниться его информация.
  4. Индекс - сборник документов. Он идентифицируется по имени. У нас может быть любое количество индексов в кластере. Рассматривайте документ как документ в MongoDB или строку в Mysql, а индекс как коллекцию или таблицу в Mongo и Mysql соответственно. (Хотя эта аналогия не на 100% верна, но кажется подходящей для понимания основ )
  5. Разделение - разделение индекса между несколькими узлами в кластере, чтобы каждый узел содержал один сегмент индекса.

Мысленное примечание. По умолчанию индекс в эластичном поиске имеет 5 сегментов и 1 реплику. Осколки можно реплицировать ноль или более раз. Индекс можно разделить на несколько сегментов.

НАЧИНАЯ

Давайте теперь начнем работать над elasticsearch, сначала установив его. Вы можете скачать elasticsearch со страницы elasticsearch. В нем есть вся информация о том, как загрузить и настроить elasticsearch. Помните, что на вашем компьютере должны быть установлены JDK и JRE.

После его установки запустите службу elasticsearch. Я работаю на машине ubuntu и использую systemctl для запуска службы elasticsearch, чтобы она тоже работала в фоновом режиме.

Как только ваш эластичный поиск будет запущен. Сделайте следующий запрос на завиток -

curl -X GET "localhost:9200"

Вы получите ответ в формате JSON -

{
 “name” : “Sid”,
 “cluster_name” : “elasticsearch”,
 “cluster_uuid” : “INQ39AFBSNmJbls1dHEyQw”,
 “version” : {
 “number” : “7.6.2”,
 “build_flavor” : “default”,
 “build_type” : “deb”,
 “build_hash” : “ef48eb35cf30adf4db14086e8aabd07ef6fb113f”,
 “build_date” : “2020–03–26T06:34:37.794943Z”,
 “build_snapshot” : false,
 “lucene_version” : “8.4.0”,
 “minimum_wire_compatibility_version” : “6.8.0”,
 “minimum_index_compatibility_version” : “6.0.0-beta1”
 },
 “tagline” : “You Know, for Search”
}

Приведенный выше JSON возвращает основную информацию о вашем кластере elasticsearch. Здесь мы видим, что я запускаю кластер с именем «elasticsearch».

Теперь давайте проследим за состоянием этого кластера с помощью API _cat. Зайдите в свой терминал и сделайте запрос на завиток

curl -X GET "localhost:9200/_cat/health?v&pretty"

Если вы получили ответ ниже, значит, ваш elasticsearch работает нормально.

Конечная точка «_cat / health» возвращает состояние кластера. Обратите внимание, что статус желтый, и причина этого в том, что существует 1 реплика для каждого индекса, но нет узла для сохранения этой реплики. Если узлов больше, состояние отображается зеленым. Вы также можете увидеть количество узлов, сегментов и т. Д. В данных ответа.

Следующим шагом будет создание индекса, в который мы введем некоторые данные. Назовем этот индекс «пользователями» для хранения всей информации, связанной с пользователями.

curl -X PUT "localhost:9200/users?pretty"

Вы получите ответ -

{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "users"
}

Теперь посмотрим на наш индекс

curl -X GET "localhost:9200/_cat/indices?v&pretty"

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

Если вы это сделаете

curl -X GET "localhost:9200/users?pretty"

вы получите ответ json как таковой -

{
  "users" : {
    "aliases" : { },
    "mappings" : { },
    "settings" : {
      "index" : {
        "creation_date" : "1587455066746",
        "number_of_shards" : "1",
        "number_of_replicas" : "1",
        "uuid" : "LoHicScDSzqBUuM0Q-V-4g",
        "version" : {
          "created" : "7060299"
        },
        "provided_name" : "users"
      }
    }
  }
}

который содержит подробную информацию о вашем недавно созданном индексе. Обратите внимание на ключ сопоставлений в ответе. Имейте в виду, что мы вернемся к нему позже.

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

СОЗДАЙТЕ

Это первый шаг, который мы сделаем. Мы добавим некоторые данные в наш недавно созданный индекс. Для этого мы снова воспользуемся put API. Здесь мы работаем над приложением, которое сохраняет данные об активных футболистах. Для хранения исходной информации о них мы будем использовать индекс игроков. Мы сделаем вызов API put с типом содержимого как application / json, как указано в документации. Имя указателя - player, и мы предоставили «_doc» в качестве типа по умолчанию (mapping - я сказал вам запомнить его пару абзацев назад).

curl -X PUT "localhost:9200/players/_doc/1?pretty" -H 'Content-Type: application/json' -d '{ "name":"Luka Modric", "age":34, "nationality":"Croatia", "club":"Real Madrid", "position":"Midfielder" }'

Полученный ответ будет примерно таким:

{
  "_index" : "players",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

Обратите внимание, что индекс игроков создается автоматически, когда мы пытаемся добавить в него какое-то значение. Тип индекса - _doc, что означает, что все документы, вставленные сюда через / player / _doc API, будут иметь тип _doc. Этот тип - просто значение по умолчанию, которое мы предоставили, вы можете использовать любое слово вместо _doc в соответствии с вашим вариантом использования. Раньше у вас могло быть много типов в одном индексе, скажем, например, у вас мог быть индекс twitter и twitter / users и twitter / tweet как два типа этого конкретного индекса, где вы могли бы хранить пользователей в twitter / users и твиты в twitter / tweets, где документы хотя и хранились бы в одном индексе, но были бы дифференцированы по разным типам, но теперь (версия ›6) для каждого индекса допускается только один тип. Поэтому, если вы используете новую версию elasticsearch, вы должны создать два индекса / users и / tweets для хранения соответствующей информации.

Итак, API для вставки значений в индекс - /----------------index_name›/*type›/*id›. Если вы не укажете идентификатор, автоматически сгенерированный идентификатор будет автоматически назначен документу, который вы только что вставили.

ЧИТАТЬ

Теперь давайте попробуем прочитать только что вставленный документ. Сделайте следующий запрос

curl -X GET 'localhost:9200/players/_doc/1?pretty'

Примечательный параметр передается, чтобы получить ответ в более читаемом формате

и вы получите-

{
  "_index" : "players",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 2,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "name" : "Luka Modric",
    "age" : 34,
    "nationality" : "Croatia",
    "club" : "Real Madrid",
    "position" : "Midfielder"
  }
}

базовое использование - GET / ‹index_name› / ‹type› / ‹id›

ОБНОВИТЬ

Теперь нам нужно обновить наш документ. Допустим, Лука Модрич сегодня стал старше на год, поэтому нам нужно обновить его возраст.

curl -X PUT "localhost:9200/players/_doc/1?pretty" -H 'Content-Type: application/json' -d '{ "age":35}'

Ваш ответ будет-

{
  "_index" : "players",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 2,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 5,
  "_primary_term" : 1
}

Обратите внимание, что ключ результата «обновлен», что показывает, что существующая запись обновлена, а номер версии теперь равен 2, что снова показывает, что этот документ был обновлен один раз после вставки.

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

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

Рассмотрим следующий запрос на завиток:

curl -X POST 'localhost:9200/players/_update/1?pretty' -H 'Content-Type:application/json' -d '               
{
"script":"ctx._source.age+=1"
}'

Вы получите следующий ответ:

{
  "_index" : "players",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 3,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 6,
  "_primary_term" : 1
}

и возраст бы увеличился на один.

УДАЛЯТЬ

Прошли годы, и Лука Модрич окончательно ушел из футбола, так что нам больше не нужна его запись, и в этом случае мы ее удалим.

curl -X DELETE 'localhost:9200/players/_doc/1?pretty'

и ответ будет

{
  "_index" : "players",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 4,
  "result" : "deleted",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 13,
  "_primary_term" : 1
}

Бонус

Поскольку мы узнали о CRUD в elasticsearch, кажется справедливым познакомиться с API поиска. Для этого я вставил несколько документов в наш индекс проигрывателя, чтобы получить больше данных для поиска.

Сделайте следующий запрос-

curl -X GET 'localhost:9200/players/_search?q=real&pretty'

Вышеупомянутый запрос будет искать все значения документа, присутствующие внутри проигрывателей, для предоставленной строки запроса, которая является «реальной». Результаты, которые я получил, были примерно такими:

{
  "took" : 9,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.43445712,
    "hits" : [
      {
        "_index" : "players",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.43445712,
        "_source" : {
          "name" : "Luka Modric",
          "age" : 35,
          "nationality" : "Croatia",
          "club" : "Real Madrid",
          "position" : "Midfielder"
        }
      },
      {
        "_index" : "players",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.43445712,
        "_source" : {
          "name" : "Marcelo",
          "age" : 29,
          "nationality" : "Brazil",
          "club" : "Real Madrid",
          "position" : "Defender"
        }
      }
    ]
  }
}

Вы можете четко видеть, что значение поля club - «Real Madrid», а наш поисковый запрос был «real »И мы получили два результата, так как эти два документа содержали указанное слово. Этот API выполняет поиск в каждом поле документа, чтобы найти строку запроса, которая нас интересует.

Если вы заметите метаданные документов, вы найдете поле _score, которое вычисляет релевантность документа, относящегося к поисковому запросу. Более высокий балл означает, что документы более релевантны поисковому запросу.

Наконец, сегодня мы многого достигли. Мы смогли настроить elasticsearch на нашей машине, запустить сервер с одним узлом, создать индексы и выполнить над ними операции CRUD и поняли, что это не так сложно, как кажется. Осознав это, я предлагаю вам увидеть массовое индексирование, потому что это практическая часть, и как только вы закончите с ним, перейдите к запросу DSL, статья о котором будет вскоре опубликована.

Если вам понравился этот пост или у вас есть вопросы, свяжитесь со мной - [email protected]

А до тех пор счастливого программирования и счастливого обучения.