我已经对
Django
项目进行了 docker 化。我想用Elasticsearch
,所以我选择了django-elasticsearch-dsl
。我的步骤是:
settings.py
) 中,我配置了 Elasticsearch 连接设置。ELASTICSEARCH_DSL = {
'default': {
'hosts': ["http://localhost:9200"],
},
}
documents.py
我的 Django 应用程序的文件。在此文件中,我定义了与我的 Django 模型相对应的 Elasticsearch
文档。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']
python3 manage.py search_index --rebuild
将 Django 模型中的数据索引到 Elasticsearch 中。我在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,并且在容器之间设置了网络。
您需要更新弹性设置,以便可以从 django 容器访问弹性。像下面这样的事情就可以了:
ELASTIC_HOST = "<name of the elastic service>"
ELASTICSEARCH_DSL = {
'default': {
'hosts': [f"http://{ELASTIC_HOST}:9200"],
},
}