无法将模型从 Django 索引到 Elasticsearch

问题描述 投票:0回答:1

我有一个

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}

所以,问题是:

  1. 如何创建和填充索引(特别是如果数据库中有大量数据并且我将使用
    bulks
    索引所有数据)?
  2. elasticsearch-dsl
    项目中使用
    django-elasticsearch-dsl
    代替
    Django
    是一个好方法吗?
python django elasticsearch
1个回答
0
投票

您的 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 可能更容易。

您也可以检查这个答案

© www.soinside.com 2019 - 2024. All rights reserved.