Почему мой запрос в Elasticsearch не показывает ни одного совпадения?
У меня есть докеризованный Django
проект. Я хочу использовать Elasticsearch
, поэтому я выбрал django-elasticsearch-dsl
. Мои шаги были следующими:
- В файле настроек моего Django-проекта (
settings.py
) я настроил параметры подключения к Elasticsearch.
ELASTICSEARCH_DSL = {
'default': {
'hosts': ["http://localhost:9200"],
},
}
- Создал файл с названием
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']
- Затем я проиндексировал данные из моей модели 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"],
},
}