Python 3.x 向Elasticsearch索引添加字段
我正在使用来构建elasticsearch索引,我想动态添加MySQL模式中不存在的字段(到创建的索引Python 3.x 向Elasticsearch索引添加字段,python-3.x,django,elasticsearch,Python 3.x,Django,elasticsearch,我正在使用来构建elasticsearch索引,我想动态添加MySQL模式中不存在的字段(到创建的索引cars) 我基于并添加了网站,以说明我想要实现的目标 Manufacturer ----< Car ----< Ad ----< Website 下面是我使用的代码的一个简单示例: model.py documents.py $ python manage.py search_index --rebuild -f Deleting index '<elasticsea
cars
)
我基于并添加了网站
,以说明我想要实现的目标
Manufacturer ----< Car ----< Ad ----< Website
下面是我使用的代码的一个简单示例:
model.py
documents.py
$ python manage.py search_index --rebuild -f
Deleting index '<elasticsearch_dsl.index.Index object at 0x10baeb3a0>'
Creating index '<elasticsearch_dsl.index.Index object at 0x10baeb3a0>'
Indexing 1 'Car' objects
Traceback (most recent call last):
File "/Users/user/git/django_es_dsl/dedsl_env/lib/python3.8/site-packages/django_elasticsearch_dsl/fields.py", line 52, in get_value_from_instance
instance = instance[attr]
TypeError: 'Car' object is not subscriptable
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/user/git/django_es_dsl/dedsl_env/lib/python3.8/site-packages/django_elasticsearch_dsl/fields.py", line 58, in get_value_from_instance
instance = getattr(instance, attr)
AttributeError: 'Car' object has no attribute 'website'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/user/git/django_es_dsl/dedsl_env/lib/python3.8/site-packages/django_elasticsearch_dsl/fields.py", line 63, in get_value_from_instance
instance = instance[int(attr)]
ValueError: invalid literal for int() with base 10: 'website'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "manage.py", line 22, in <module>
main()
File "manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "/Users/user/git/django_es_dsl/dedsl_env/lib/python3.8/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
utility.execute()
File "/Users/user/git/django_es_dsl/dedsl_env/lib/python3.8/site-packages/django/core/management/__init__.py", line 375, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/Users/user/git/django_es_dsl/dedsl_env/lib/python3.8/site-packages/django/core/management/base.py", line 323, in run_from_argv
self.execute(*args, **cmd_options)
File "/Users/user/git/django_es_dsl/dedsl_env/lib/python3.8/site-packages/django/core/management/base.py", line 364, in execute
output = self.handle(*args, **options)
File "/Users/user/git/django_es_dsl/dedsl_env/lib/python3.8/site-packages/django_elasticsearch_dsl/management/commands/search_index.py", line 134, in handle
self._rebuild(models, options)
File "/Users/user/git/django_es_dsl/dedsl_env/lib/python3.8/site-packages/django_elasticsearch_dsl/management/commands/search_index.py", line 115, in _rebuild
self._populate(models, options)
File "/Users/user/git/django_es_dsl/dedsl_env/lib/python3.8/site-packages/django_elasticsearch_dsl/management/commands/search_index.py", line 92, in _populate
doc().update(qs)
File "/Users/user/git/django_es_dsl/dedsl_env/lib/python3.8/site-packages/django_elasticsearch_dsl/documents.py", line 162, in update
return self.bulk(
File "/Users/user/git/django_es_dsl/dedsl_env/lib/python3.8/site-packages/django_elasticsearch_dsl/documents.py", line 123, in bulk
return bulk(client=self._get_connection(), actions=actions, **kwargs)
File "/Users/user/git/django_es_dsl/dedsl_env/lib/python3.8/site-packages/elasticsearch/helpers/actions.py", line 297, in bulk
for ok, item in streaming_bulk(client, actions, *args, **kwargs):
File "/Users/user/git/django_es_dsl/dedsl_env/lib/python3.8/site-packages/elasticsearch/helpers/actions.py", line 208, in streaming_bulk
for bulk_data, bulk_actions in _chunk_actions(
File "/Users/user/git/django_es_dsl/dedsl_env/lib/python3.8/site-packages/elasticsearch/helpers/actions.py", line 60, in _chunk_actions
for action, data in actions:
File "/Users/user/git/django_es_dsl/dedsl_env/lib/python3.8/site-packages/django_elasticsearch_dsl/documents.py", line 146, in _get_actions
yield self._prepare_action(object_instance, action)
File "/Users/user/git/django_es_dsl/dedsl_env/lib/python3.8/site-packages/django_elasticsearch_dsl/documents.py", line 132, in _prepare_action
self.prepare(object_instance) if action != 'delete' else None
File "/Users/user/git/django_es_dsl/dedsl_env/lib/python3.8/site-packages/django_elasticsearch_dsl/documents.py", line 98, in prepare
field_value = field.get_value_from_instance(
File "/Users/user/git/django_es_dsl/dedsl_env/lib/python3.8/site-packages/django_elasticsearch_dsl/fields.py", line 120, in get_value_from_instance
objs = super(ObjectField, self).get_value_from_instance(
File "/Users/user/git/django_es_dsl/dedsl_env/lib/python3.8/site-packages/django_elasticsearch_dsl/fields.py", line 68, in get_value_from_instance
raise VariableLookupError(
django_elasticsearch_dsl.exceptions.VariableLookupError: Failed lookup for key [website] in <Car: Car object (1)>
from django.db import models
class Car(models.Model):
name = models.CharField(max_length=100)
manufacturer = models.ForeignKey('Manufacturer', on_delete=models.CASCADE, null=True)
class Manufacturer(models.Model):
name = models.CharField(max_length=100)
class Ad(models.Model):
title = models.CharField(max_length=100)
url = models.URLField(null=True)
car = models.ForeignKey('Car', related_name='ads', on_delete=models.CASCADE)
class Website(models.Model):
name = models.CharField(max_length=100)
url = models.URLField(null=True)
ad = models.ForeignKey('Ad', related_name='website', on_delete=models.CASCADE)
from django_elasticsearch_dsl import Document, fields
from django_elasticsearch_dsl.registries import registry
from elasticsearch_dsl import analyzer
from .models import Car, Manufacturer, Ad, Website
@registry.register_document
class CarDocument(Document):
manufacturer = fields.ObjectField(properties={
'name': fields.TextField(),
})
ads = fields.NestedField(properties={
'title': fields.TextField(),
'pk': fields.IntegerField(),
})
website = fields.ObjectField(properties={
'name': fields.TextField(),
})
class Index:
name = 'cars'
class Django:
model = Car
fields = [
'name',
]
related_models = [Manufacturer, Ad]
# Adding the data
m = Manufacturer(
id=1,
name='manuf1',
)
m.save()
car = Car(
id=1,
name="Car one",
manufacturer=m
)
car.save()
ad = Ad(
id=1,
title='Ads title',
url='https://www.example.com/ads-url-goes-here',
car=car
)
ad.save()
ws = Website(
id=1,
name='Ads Website',
url='https://www.example.com',
ad=ad
)
ws.save()