2017-10-21 1 views
0

私たちはDjango MarkupFieldを使ってMarkdownテキストを保存しています。wagtailのカスタムDjangoモデルフィールドにインデックスを付ける

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を返すインデックス呼び出し可能オブジェクトにあるが、その後、私たちはものを書く必要があるだろう:私たちはインデックスにしようとすると

しかし、セキレイでこれらのフィールドは、我々はこのように、Elasticsearchからシリアル化のエラーが出ます私たちがモデルで持っているすべてのMarkdownフィールドプロパティに対して呼び出すことができます。フィールドプロパティ(MarkupFieldを置き換えるdjango-markupfield Markupクラス)をget_searchable_content(value)メソッドに拡張することでこの問題を回避できると考えていましたが、シリアライズエラーがそのまま残ります。

Wagtail + elasticsearchでカスタムDjangoフィールドのインデックスを作成するヒントはありますか?

答えて

0

私は間違った場所にget_searchable_contentを入れていた、私はそれがMarkupクラスで必要と思ったが、代わりにそれはDjangoのモデルFieldクラス自体の上に配置する必要があります。その後、Wagtailはelasticsearch(または他の検索バックエンド)で索引付けされる適切な値を引き出します。

最も簡単な解決策は、MarkupFieldをカスタムFieldクラスで拡張し、その実装をMarkupField.get_prep_valueに委譲するget_searchable_content(self, value)を追加することでした。

2

いくつかの方法があります。最良の方法は、elasticsearch-dslに独自のフィールドを作成することです(たとえば0を参照)。これを使用して(de)シリアル化を行います。他のオプションは、markupfield.fields.Markupオブジェクトを扱うことができるElasticsearchコンストラクタのserializer=MyJSONSerializer()として、独自のJSONSerializer(1)サブクラスを作成して渡すことです。

0からhttps://github.com/elastic/elasticsearch-dsl-py/blob/master/test_elasticsearch_dsl/test_document.py#L49-L58 1からhttps://github.com/elastic/elasticsearch-py/blob/master/elasticsearch/serializer.py#L24

関連する問題