Введение в Elasticsearch
Прежде чем углубляться в тонкости создания распределённой поисковой системы с использованием Go и Elasticsearch, давайте остановимся и разберёмся, что такое Elasticsearch и почему он является мощным инструментом в мире поиска и аналитики.
Elasticsearch — это открытый исходный код, распределённая система полнотекстового поиска и аналитики, построенная на Apache Lucene. Она предназначена для горизонтальной масштабируемости, максимальной надёжности и простого управления. Elasticsearch широко используется для полнотекстового поиска, анализа журналов и оперативной аналитики, что делает его идеальным выбором для нашей распределённой системы поиска.
Настройка Elasticsearch
Чтобы начать работу, вам необходимо настроить Elasticsearch. Вот пошаговое руководство:
Скачайте и установите Elasticsearch
- Скачайте Elasticsearch с официального сайта.
- Извлеките скачанный файл.
- Перейдите в извлечённую папку и выполните следующую команду, чтобы запустить Elasticsearch:Теперь Elasticsearch должен работать на
./bin/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», который хранит документы блогов.
- Осколки: подразделения индекса, позволяющие проводить параллельный поиск и увеличивать мощность запросов. Каждый осколок может размещаться на любом узле в кластере, обеспечивая избыточность и защищая от сбоев оборудования.
Примечание: перевод выполнен с использованием общедоступных онлайн-сервисов. За достоверность и качество перевода автор статьи ответственности не несёт.