【发布时间】:2018-04-02 05:03:40
【问题描述】:
我们使用Django MarkupField 来存储 Markdown 文本,它工作得很好。
但是,当我们尝试在 Wagtail 中为这些字段编制索引时,我们会从 Elasticsearch 中收到序列化错误,如下所示:
File "/usr/local/lib/python3.5/dist-packages/wagtail/wagtailsearch/management/commands/update_index.py", line 120, in handle
self.update_backend(backend_name, schema_only=options.get('schema_only', False))
File "/usr/local/lib/python3.5/dist-packages/wagtail/wagtailsearch/management/commands/update_index.py", line 87, in update_backend
index.add_items(model, chunk)
File "/usr/local/lib/python3.5/dist-packages/wagtail/wagtailsearch/backends/elasticsearch.py", line 579, in add_items
bulk(self.es, actions)
File "/usr/local/lib/python3.5/dist-packages/elasticsearch/helpers/__init__.py", line 195, in bulk
for ok, item in streaming_bulk(client, actions, **kwargs):
File "/usr/local/lib/python3.5/dist-packages/elasticsearch/helpers/__init__.py", line 162, in streaming_bulk
for bulk_actions in _chunk_actions(actions, chunk_size, max_chunk_bytes, client.transport.serializer):
File "/usr/local/lib/python3.5/dist-packages/elasticsearch/helpers/__init__.py", line 61, in _chunk_actions
data = serializer.dumps(data)
File "/usr/local/lib/python3.5/dist-packages/elasticsearch/serializer.py", line 50, in dumps
raise SerializationError(data, e)
elasticsearch.exceptions.SerializationError: ({'_partials': [<markupfield.fields.Markup object at 0x7faa6e238e80>, <markupfield.fields.Markup object at 0x7faa6dbc4da0>], 'pk': '1', 'research_interests': <markupfield.fields.Markup object at 0x7faa6e238e80>, 'bio': <markupfield.fields.Markup object at 0x7faa6dbc4da0>}, TypeError("Unable to serialize <markupfield.fields.Markup object at 0x7faa6e238e80> (type: <class 'markupfield.fields.Markup'>)",))
一种解决方法是索引返回 field.raw 的可调用对象,但随后我们必须为模型中的每个 Markdown 字段属性编写一个这样的可调用对象。我认为我们可以通过使用get_searchable_content(value) 方法扩展字段属性(即替换MarkupField 的django-markupfield Markup 类)来解决这个问题,但序列化错误仍然存在。
有没有人有任何关于在 Wagtail + elasticsearch 中索引自定义 Django 字段的提示?
【问题讨论】:
标签: django elasticsearch wagtail elasticsearch-py