我有一个
Django
项目,我们将使用 Elasticsearch
进行全文搜索。我的任务是将其与现有的 Django
项目连接起来。我发现的第一件事就是django-elasticsearch-dsl
包裹。我按照教程中的方式做了所有事情,并且一切正常,但想法是使用 elasticsearch-dsl
。我现在不明白如何创建索引。如果在 django-elasticsearch-dsl
中,我唯一需要的是在 python3 manage.py search_index --rebuild
容器内运行 Django
,但在这里我不知道。我将所有代码存储在documents.py中。
文档.py
from elasticsearch_dsl.connections import connections
from elasticsearch_dsl import Document, Text
connections.create_connection(hosts=['http://elasticsearch:9200'])
class FilmWorkDocument(Document):
title = Text()
description = Text()
class Index:
name = 'film'
FilmWorkDocument.init()
first = FilmWorkDocument(title='Example1', description='Example description')
first.meta.id = 47
first.save()
docker-compose.yml
elasticsearch:
image: elasticsearch:8.13.0
container_name: elasticsearch
environment:
- "ES_JAVA_OPTS=-Xms200m -Xmx200m"
- discovery.type=single-node
- xpack.security.enabled=false
ports:
- 9200:9200
发送请求
http://localhost:9200
表明一切正常。
{
"name" : "eeb958274241",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "wUQjIKoLTNGKtFH7A1tzSw",
"version" : {
"number" : "8.13.0",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "09df99393193b2c53d92899662a8b8b3c55b45cd",
"build_date" : "2024-03-22T03:35:46.757803203Z",
"build_snapshot" : false,
"lucene_version" : "9.10.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
但是发送请求后
http://localhost:9200/film/
显示索引不存在。
{"error":{"root_cause":[{"type":"index_not_found_exception","reason":"no such index [film]","resource.type":"index_or_alias","resource.id":"film","index_uuid":"_na_","index":"film"}],"type":"index_not_found_exception","reason":"no such index [film]","resource.type":"index_or_alias","resource.id":"film","index_uuid":"_na_","index":"film"},"status":404}
所以,问题是:
bulks
索引所有数据)?elasticsearch-dsl
项目中使用 django-elasticsearch-dsl
代替 Django
是一个好方法吗?您的 Python 代码可能无法连接到在 Docker 容器内运行的 Elasticsearch。你提到过
发送请求到http://localhost:9200显示一切正常 好的。
您可以尝试使用 localhost:9200 而不是 elasticsearch:9200 吗?
问题1的答案:
要在Elasticsearch中创建并填充索引,特别是在处理大量数据时,可以使用以下代码:
from elasticsearch.helpers import bulk
from elasticsearch_dsl import Document, Text, connections
es = connections.create_connection(hosts=['http://localhost:9200'], timeout=60)
class FilmWorkDocument(Document):
title = Text()
description = Text()
class Index:
name = 'film'
def generate_documents():
for data in FilmWork.objects.all():
yield {
"_index": FilmWorkDocument.Index.name,
"_id": data.id,
"_source": {
"title": data.title,
"description": data.description,
}
}
def bulk_indexing():
es.indices.delete(index=FilmWorkDocument.Index.name, ignore=[400, 404])
print(f"Deleted index: {FilmWorkDocument.Index.name}")
FilmWorkDocument.init(using='es')
print(f"Initialized index: {FilmWorkDocument.Index.name}")
# Perform bulk indexing
bulk(es, generate_documents())
if __name__ == '__main__':
bulk_indexing()
问题2的答案:
elasticsearch-dsl: 为您提供更多控制,但需要更多手动处理。您必须显式管理连接、索引和搜索逻辑。如果您需要灵活性并希望将搜索逻辑与 Django 解耦,这是一个更好的方法。
django-elasticsearch-dsl:它抽象了大部分 Elasticsearch 管理并与 Django 模型紧密集成。如果您想要在保存模型时使用更 Django 原生的自动索引方法,那么 django-elasticsearch-dsl 是一个不错的选择。它会自动创建索引并将其与您的模型同步。
如果您喜欢elasticsearch-dsl的灵活性并且不介意手动处理索引管理,那么这是一个很好的方法。对于自动模型索引的 Django 原生体验,django-elasticsearch-dsl 可能更容易。
您也可以检查这个答案。