2017-10-21 1 views
0

우리는 Markdown 텍스트를 저장하기 위해 Django MarkupField을 사용하고 있습니다. 아주 잘 작동합니다.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를 반환 인덱스 callables에 있지만 우리는 하나를 작성해야 할 것 : 우리가 인덱스하려고 할 때

그러나, 할미새에서 이러한 필드는 우리는 다음과 같이 Elasticsearch에서 직렬화 오류가 발생할 수 우리 모델에서 가지고있는 모든 Markdown 필드 속성에 대해 호출 할 수 있습니다. get_searchable_content(value) 메소드로 필드 속성 (즉, MarkupField을 대체하는 django-markupfield Markup 클래스)을 확장하여이 문제를 해결할 수 있다고 생각했지만 직렬화 오류가 지속됩니다.

누구든지 Wagtail + elasticsearch에서 사용자 정의 Django 필드를 인덱싱하기위한 팁이 있습니까?

답변

0

내가 잘못된 장소에 get_searchable_content를 넣어했다, 나는 그것이 Markup 클래스에서 필요하다고 생각하지만, 대신 장고 모델 Field 클래스 자체에 배치 될 필요가있다. 그런 다음 Wagtail은 elasticsearch (또는 다른 검색 백엔드)에서 색인 될 적절한 값을 가져옵니다.

가장 직접적인 해결책은 MarkupField을 사용자 정의 Field 클래스로 확장하고 구현을 MarkupField.get_prep_value에 위임하는 get_searchable_content(self, value)을 추가하는 것이 었습니다.

2

여러 가지 방법이 있습니다. 가장 좋은 방법은 자신의 필드를 elasticsearch-dsl에 작성하고, 예를 들어 (0)을 참조한 후 (de) 직렬화에 사용하는 것입니다. 다른 옵션은 자신의 JSONSerializer (1) 하위 클래스를 만들고 markupfield.fields.Markup 개체를 처리 할 수있는 Elasticsearch 생성자의 serializer=MyJSONSerializer()으로 전달하는 것입니다.

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

관련 문제