Nous utilisons Django MarkupField pour stocker le texte Markdown et cela fonctionne plutôt bien.indexation des champs de modèles personnalisés de Django dans wagtail
Cependant, lorsque nous essayons d'indexer ces champs Bergeronnette nous obtenons des erreurs de sérialisation de ElasticSearch, comme ceci:
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'>)",))
Une solution consiste à appelables d'index qui renvoient field.raw
mais nous aurions dû écrire un tel appelable pour chaque propriété de champ Markdown que nous avons dans nos modèles. Je pensais que nous pourrions contourner cela en étendant la propriété de champ (c'est-à-dire, la classe django-markupfield Markup
qui remplace le MarkupField
) avec une méthode get_searchable_content(value)
mais les erreurs de sérialisation persistent.
Quelqu'un a-t-il des astuces pour indexer des champs Django personnalisés dans Wagtail + elasticsearch?