Подключение ElasticSearch к Django с помощью "django-elasticsearch-dsl" приводит к ConnectionError при попытке создать/перестроить индекс
Я пытаюсь вызвать локальный экземпляр ES, запущенный на docker. Я использовал следующие инструкции для настройки моего экземпляра ES: https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html. https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#docker-cli-run-dev-mode
Я могу играть с моим экземпляром на Kibana по адресу http://0.0.0.0:5601/app/dev_tools#/console. Все работает до этого места.
Теперь я пытаюсь определить несколько образцов документов, используя модели django, и проиндексировать их через библиотеку; я следую инструкциям здесь: https://django-elasticsearch-dsl.readthedocs.io/en/latest/quickstart.html#install-and-configure
Сначала я установил pip и добавил django_elasticsearch_dsl
в INSTALLED_APPS
Далее, я добавил в settings.py:
ELASTICSEARCH_DSL = {
'default': {
'hosts': 'localhost:9200'
},
}
Затем я создаю образец модели и документа, который выглядит следующим образом:
# models.py
from django.db import models
class Car(models.Model):
name = models.CharField(max_length=30)
color = models.CharField(max_length=30)
description = models.TextField()
type = models.IntegerField(choices=[
(1, "Sedan"),
(2, "Truck"),
(4, "SUV"),
])
# documents.py
from django_elasticsearch_dsl import Document
from django_elasticsearch_dsl.registries import registry
from .models import Car
@registry.register_document
class CarDocument(Document):
class Index:
# Name of the Elasticsearch index
name = 'cars'
# See Elasticsearch Indices API reference for available settings
settings = {'number_of_shards': 1,
'number_of_replicas': 0}
class Django:
model = Car # The model associated with this Document
# The fields of the model you want to be indexed in Elasticsearch
fields = [
'name',
'color',
'description',
'type',
]
Наконец, выполнение python3 manage.py search_index --rebuild
приводит к следующей ошибке подключения:
raise ConnectionError("N/A", str(e), e)
elasticsearch.exceptions.ConnectionError: ConnectionError(('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))) caused by: ProtocolError(('Connection aborted.', RemoteDisconnected('Remote end closed connection without response')))
Я подозреваю, что проблема может быть в моей настройке ELASTICSEARCH_DSL
, так как я не указал никаких настроек для https, но документация не проясняет этого.
Как мне решить эту проблему?
Django version:
Django==4.0.1
django-elasticsearch-dsl==7.2.2
Python version: Python 3.9.10
Спасибо!
Я решил, что это проблема с моим сертификатом.
Мне нужно было добавить некоторые дополнительные параметры конфигурации к переменной ELASTICSEARCH_DSL
. Добавление этого параметра решило проблему:
from elasticsearch import RequestsHttpConnection
# Elasticsearch configuration in settings.py
ELASTICSEARCH_DSL = {
'default': {
'hosts': 'localhost:9200',
'use_ssl': True,
'http_auth': ('user', 'password'),
'ca_certs': '/path/to/cert.crt'
'connection_class': RequestsHttpConnection
}
}
См. этот раздел документации по проверке сертификата.
Если вы не установили сертификат для аутентификации соединения и вам просто нужно быстро запустить что-то, вы можете передать 'verify_certs': False
и установить 'ca_certs'
значение None
.