Django haystack LocationField создается как строка вместо geo_point в elasticsearch

Я использую django 1.8.9, django-rest-framework, django-haystack вместе с Elasticsearch и пытаюсь получить работу LocationField, индекс создается, но тип всегда является string вместо geo_point , поэтому, очевидно, никаких поисков geo_point не работает ,

settings.py:

 INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.gis', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.admin', 'django_extensions', 'elasticsearch', 'rest_framework', 'haystack', ) 

requirements.txt:

 Django==1.8.9 django-appconf==1.0.1 django-compressor==1.6 django-extensions==1.6.1 django-filter==0.11.0 django-haystack==2.4.1 djangorestframework==3.3.1 djangorestframework-jwt==1.7.2 ecdsa==0.13 elasticsearch==2.2.0 Fabric==1.10.2 future==0.15.2 geopy==1.11.0 gunicorn==19.4.1 Markdown==2.6.5 paramiko==1.16.0 psycopg2==2.6.1 pycrypto==2.6.1 PyJWT==1.4.0 python-dateutil==2.4.2 python-memcached==1.57 setproctitle==1.1.9 six==1.10.0 urllib3==1.14 

search_indexes.py:

 from haystack import indexes from blah.api.models import MyModel class MyIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.CharField(document=True, use_template=True) description = indexes.CharField(model_attr='description') location = indexes.LocationField(model_attr='get_location') created = indexes.DateTimeField(model_attr='created') def get_model(self): return MyModel 

свойство get_location в MyModel:

 from haystack.utils.geo import Point def get_location(self): return Point(self.lng, self.lat) 

индекс elasticsearch создан (извините за форматирование!):

 { "myindex":{ "mappings":{ "modelresult":{ "properties":{ "created":{ "type":"date", "format":"strict_date_optional_time||epoch_millis" }, "description":{ "type":"string" }, "django_ct":{ "type":"string" }, "django_id":{ "type":"string" }, "id":{ "type":"string" }, "location":{ "type":"string" }, "text":{ "type":"string" } } } } } } 

У кого-нибудь есть идеи? Похоже, что это сочетание версий между django, django-haystack и elasticsearch, которые не играют красиво, но я не могу заставить любую комбинацию работать.

2 Solutions collect form web for “Django haystack LocationField создается как строка вместо geo_point в elasticsearch”

Хорошо, я выяснил, в чем проблема: в Elasticsearch 2.0 есть изменения в метаданных, один из которых является удалением, который был удален: https://www.elastic.co/guide/en/elasticsearch/reference/current/ breaking_20_mapping_changes.html # миграционно-мета-поля

Отслеживая запрос через elasticsearch/transport.py , запрос PUT на http://127.0.0.1:9200/myindex/_mapping/modelresult включает в себя «_boost»: {«name»: «boost», «null_value»: 1.0} в тело.

Таким образом, отслеживание звонков и перепечатка их как CURL:

СОЗДАТЬ ИНДЕКС

 curl -X PUT -d '{"settings": {"analysis": {"filter": {"haystack_edgengram": {"max_gram": 15, "type": "edgeNGram", "min_gram": 2}, "haystack_ngram": {"max_gram": 15, "type": "nGram", "min_gram": 3}}, "tokenizer": {"haystack_ngram_tokenizer": {"max_gram": 15, "type": "nGram", "min_gram": 3}, "haystack_edgengram_tokenizer": {"max_gram": 15, "type": "edgeNGram", "side": "front", "min_gram": 2}}, "analyzer": {"edgengram_analyzer": {"filter": ["haystack_edgengram", "lowercase"], "type": "custom", "tokenizer": "standard"}, "ngram_analyzer": {"filter": ["haystack_ngram", "lowercase"], "type": "custom", "tokenizer": "standard"}}}}}' http://127.0.0.1:9200/myindex 

ПРОБЛЕМЫ НЕИСПРАВНОСТИ

 curl -X PUT -d '{"modelresult": {"_boost": {"name": "boost", "null_value": 1.0}, "properties": {"django_id": {"include_in_all": false, "index": "not_analyzed", "type": "string"}, "description": {"type": "string", "analyzer": "snowball"}, "created": {"type": "date"}, "text": {"type": "string", "analyzer": "snowball"}, "django_ct": {"include_in_all": false, "index": "not_analyzed", "type": "string"}, "location": {"type": "geo_point"}}}}' http://127.0.0.1:9200/myindex/_mapping/modelresult 

Переход к этим работам

 curl -X PUT -d '{"modelresult": {"properties": {"django_id": {"include_in_all": false, "index": "not_analyzed", "type": "string"}, "description": {"type": "string", "analyzer": "snowball"}, "created": {"type": "date"}, "text": {"type": "string", "analyzer": "snowball"}, "django_ct": {"include_in_all": false, "index": "not_analyzed", "type": "string"}, "location": {"type": "geo_point"}}}}' http://127.0.0.1:9200/myindex/_mapping/modelresult 

Итак, исправление python В haystack / backends / elasticsearch_backend.py закомментируйте секцию boost из current_mapping в строке 137-140

Возможно, это не работает, потому что get_location не является полем на MyModel . Возможно, вы можете избежать создания местоположения в качестве поля, добавив декоратор @property , например:

 from haystack.utils.geo import Point @property def get_location(self): return Point(self.lng, self.lat) 

EDIT: Это не похоже, что это решит проблему. У вас это есть, как в документации.

Interesting Posts

Невозможно решить AttributeError: объект «Настройки» не имеет атрибута «ROOT_URLCONF» голограммы после проведения большого количества исследований

Установка модуля pxon cx_Oracle в Windows и подключение к базе данных Oracle

Каков наиболее эффективный способ установки строк в нули для разреженной матрицы scipy?

Реверсирование порядка слов предложения кусками

Проблема импорта xlrd с Python 2.7

Получение позиции курсора в Python

Ввод трубы в программу Python и последующий ввод данных от пользователя

Как создать N-кортежи в Python?

Извлеките ссылки для определенного раздела только из blogspot с помощью BeautifulSoup

Используйте команды a.any () или a.all ()

Python: как отсортировать алфавит в списке без сортировки?

Могу ли я подделывать / издеваться над типом моих макетных объектов в python unittests

Запуск пауков Scrapy в задаче Сельдерея

создание списка по умолчанию в python

Как удалить белые символы из файла конфигурации?

Python - лучший язык программирования в мире.