Почему мой запрос в Elasticsearch не показывает ни одного совпадения?

У меня есть докеризованный Django проект. Я хочу использовать Elasticsearch, поэтому я выбрал django-elasticsearch-dsl. Мои шаги были следующими:

  1. В файле настроек моего Django-проекта (settings.py) я настроил параметры подключения к Elasticsearch.
ELASTICSEARCH_DSL = {
    'default': {
        'hosts': ["http://localhost:9200"],
    },
}
  1. Создал файл с названием documents.py моего приложения Django. В этом файле я определил Elasticsearch документы, соответствующие моим моделям Django.
from django_elasticsearch_dsl import Document
from django_elasticsearch_dsl.registries import registry


from .models import Filmwork

@registry.register_document
class FilmWorkDocument(Document):
    class Index:
        name = 'film'
        settings = {'number_of_shards': 1, 'number_of_replicas': 0}

    class Django:
        model = Filmwork 
        fields = ['title', 'description']
  1. Затем я проиндексировал данные из моей модели Django в Elasticsearch с помощью команды python3 manage.py search_index --rebuild. Я использовал эту команду вне docker, она показала:
File "/Users/ArtemBoss/Desktop/artem_yandex_repo/venv/lib/python3.10/site-packages/psycopg2/__init__.py", line 122, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
django.db.utils.OperationalError: could not translate host name "database" to address: nodename nor servname provided, or not known

В то же время, когда я пытаюсь проиндексировать данные внутри контейнера django, он показывает:

File "/usr/local/lib/python3.10/site-packages/elastic_transport/_node/_http_urllib3.py", line 202, in perform_request
    raise err from None
elastic_transport.ConnectionError: Connection error caused by: ConnectionError(Connection error caused by: NewConnectionError(<urllib3.connection.HTTPConnection object at 0x7f9150762b60>: Failed to establish a new connection: [Errno 111] Connection refused))

Индекс был успешно создан, но когда я посылаю запрос http://localhost:9200/film, он не показывает никаких хитов, как будто нет никаких документов:

{"film":{"aliases":{},"mappings":{"properties":{"description":{"type":"text"},"title":{"type":"text"}}},"settings":{"index":{"routing":{"allocation":{"include":{"_tier_preference":"data_content"}}},"number_of_shards":"1","provided_name":"film","creation_date":"1714573697677","number_of_replicas":"0","uuid":"wtFsSoZUSXC73s5ScCbc2w","version":{"created":"8503000"}}}}}

В чем проблема?

Насколько я понял, postgres и elastic также работают как контейнеры, возможно, как docker-compose сервисы.

Первая ошибка (когда вы пытаетесь проиндексировать записи, запущенные search_index --rebuild на хосте) говорит о том, что он не может найти БД. Из второй ошибки я понял, что настройки БД правильно определены для загрузки django и сетевое взаимодействие настроено между контейнерами.

Вам нужно обновить настройки elastic, чтобы к elastic можно было получить доступ из контейнера django. Для этого подойдет что-то вроде следующего:

ELASTIC_HOST = "<name of the elastic service>"
ELASTICSEARCH_DSL = {
    'default': {
        'hosts': [f"http://{ELASTIC_HOST}:9200"],
    },
}
Вернуться на верх