Введение в Elasticsearch

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

Elasticsearch — это открытый исходный код, распределённая система полнотекстового поиска и аналитики, построенная на Apache Lucene. Она предназначена для горизонтальной масштабируемости, максимальной надёжности и простого управления. Elasticsearch широко используется для полнотекстового поиска, анализа журналов и оперативной аналитики, что делает его идеальным выбором для нашей распределённой системы поиска.

Настройка Elasticsearch

Чтобы начать работу, вам необходимо настроить Elasticsearch. Вот пошаговое руководство:

Скачайте и установите Elasticsearch

  1. Скачайте Elasticsearch с официального сайта.
  2. Извлеките скачанный файл.
  3. Перейдите в извлечённую папку и выполните следующую команду, чтобы запустить Elasticsearch:
    ./bin/elasticsearch
    
    Теперь Elasticsearch должен работать на http://localhost:9200.

Использование Docker (необязательно)

Если вы предпочитаете использовать Docker, вы можете настроить Elasticsearch с помощью следующих команд:

docker pull docker.elastic.co/elasticsearch/elasticsearch:7.5.2
docker volume create elasticsearch
docker run -d --name elasticsearch -p 9200:9200 -v elasticsearch:/usr/share/elasticsearch/data docker.elastic.co/elasticsearch/elasticsearch:7.5.2

Это запустит контейнер Elasticsearch и обеспечит сохранение данных даже после перезапуска контейнера.

Введение в язык программирования Go

Go, или Golang, — это язык программирования с открытым исходным кодом, разработанный Google. Он известен своей простотой, эффективностью и сильной поддержкой параллельного программирования. Go завоевал популярность среди разработчиков благодаря своей производительности, простоте и поддержке сообщества.

Создание проекта Go и подключение клиента Elasticsearch

Установите Go

Убедитесь, что у вас установлен Go на вашем компьютере. Вы можете скачать его с официального веб-сайта Go.

Создайте проект Go

Создайте новый каталог для вашего проекта и инициализируйте его как модуль Go:

mkdir go-elasticsearch
cd go-elasticsearch
go mod init go-elasticsearch

Подключите клиент Elasticsearch

Установите официальный клиент Elasticsearch для Go с помощью следующей команды:

go get github.com/elastic/go-elasticsearch/v8

Подключение к Elasticsearch из Go

Вот простая программа Go для подключения к Elasticsearch и печати информации о сервере:

package main

import (
    "log"

    "github.com/elastic/go-elasticsearch/v8"
)

func main() {
    es, err := elasticsearch.NewDefaultClient()
    if err != nil {
        log.Fatalf("Error creating the client: %s", err)
    }

    log.Println(elasticsearch.Version)
    res, err := es.Info()
    if err != nil {
        log.Fatalf("Error getting response: %s", err)
    }

    defer res.Body.Close()
    log.Println(res)
}

Запустите эту программу с go run main.go, чтобы убедиться, что всё настроено правильно.

Индексация данных в Elasticsearch

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

package main

import (
    "fmt"
    "log"
    "strings"

    "github.com/elastic/go-elasticsearch/v8"
    "github.com/elastic/go-elasticsearch/v8/esapi"
)

func main() {
    es, err := elasticsearch.NewDefaultClient()
    if err != nil {
        log.Fatalf("Error creating the client: %s", err)
    }

    // Index a document
    doc := `{"title": "Go and Elasticsearch", "content": "A tutorial on how to use Go and Elasticsearch together"}`
    req := esapi.IndexRequest{
        Index:      "articles",
        DocumentID: "1",
        Body:       strings.NewReader(doc),
        Refresh:    "true",
    }

    res, err := req.Do(es)
    if err != nil {
        log.Fatalf("Error indexing document: %s", err)
    }

    defer res.Body.Close()
    fmt.Println(res)
}

Запустите программу, чтобы проиндексировать документ в индексе «articles».

Поиск данных в Elasticsearch

Чтобы найти документы, вы можете использовать SearchRequest из клиента Elasticsearch:

package main

import (
    "fmt"
    "log"
    "strings"

    "github.com/elastic/go-elasticsearch/v8"
    "github.com/elastic/go-elasticsearch/v8/esapi"
)

func main() {
    es, err := elasticsearch.NewDefaultClient()
    if err != nil {
        log.Fatalf("Error creating the client: %s", err)
    }

    // Search for documents
    query := `{"query": {"match": {"title": "Go"}}}`
    req := esapi.SearchRequest{
        Index: []string{"articles"},
        Body:  strings.NewReader(query),
    }

    res, err := req.Do(es)
    if err != nil {
        log.Fatalf("Error searching documents: %s", err)
    }

    defer res.Body.Close()
    fmt.Println(res)
}

Запустите программу для поиска документов в индексе «articles», соответствующих запросу.

Понимание терминологии Elasticsearch

  • Узлы: отдельные процессы Elasticsearch. Обычно вы запускаете один процесс Elasticsearch на машину, и эти процессы формируют кластер при подключении через сеть.
  • Кластер: группа узлов, которые работают вместе для хранения, поиска и анализа данных. Кластер управляет собой, обеспечивая здоровье узлов и решая, какие документы идут на какие узлы.
  • Документы и индексы: документы — это объекты JSON, представляющие сущности. Они группируются в индексы, похожие на таблицы в реляционных базах данных или коллекции в MongoDB. Например, у вас может быть индекс под названием «blog_posts», который хранит документы блогов.
  • Осколки: подразделения индекса, позволяющие проводить параллельный поиск и увеличивать мощность запросов. Каждый осколок может размещаться на любом узле в кластере, обеспечивая избыточность и защищая от сбоев оборудования.

Примечание: перевод выполнен с использованием общедоступных онлайн-сервисов. За достоверность и качество перевода автор статьи ответственности не несёт.