当前位置: 首页 > 面试题库 >

Django Haystack LocationField在Elasticsearch中创建为字符串而不是geo_point

阚通
2023-03-14
问题内容

我正在将django 1.8.9,django-rest-framework,django-
haystack与Elasticsearch一起使用,并尝试使LocationField工作,创建了索引,但是类型始终stringgeo_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

MyModel的get_location属性:

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之间版本的组合不能很好地发挥,但是我似乎无法获得任何组合。


问题答案:

好的,我已经弄清楚了问题所在:在Elasticsearch
2.0中,存在元数据更改,其中一项boost已被删除:https :
//www.elastic.co/guide/en/elasticsearch/reference/current/breaking_20_mapping_changes
.html#migration-meta-
fields

追溯到elasticsearch/transport.py,对http://127.0.0.1:9200/myindex/_mapping/modelresult的PUT请求在正文中包括“
_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中,注释掉了第137-140行中current_mapping的bo​​ost部分



 类似资料:
  • 我正在尝试实现一种检测重复文件的方法。我有一个MD5散列方法(让我们忽略MD5被破坏的事实)如下所示: 除了从< code>hashBytes中创建一个< code>string之外,我是否可以像这样简单地创建一个< code>Guid? 它仍然有效还是我会失去唯一性?

  • 问题内容: 在.NET Framework 的参考中,使用type 声明请求类型。 在RFC 2616 中,声明了所有HTTP请求方法(例如POST,GET,PUT,DELETE …)。 .NET 和类中也存在类似的行为。 Java在方法上有类似的方法。 这些语言设计者为什么不考虑为这些HTTP方法实现枚举? 你有好主意吗? 问题答案: RFC 2616 链接的第一句话(添加了重点): HTTP

  • 问题内容: 样本数据: 我使用以下查询将’ ‘’分隔的字符串分成几行: 我的查询存在问题,我不想为每个拆分的电子邮件地址创建新行-我想为其添加新列。 email_address列中最多有3个单独的电子邮件地址。有什么建议?如果它的大小超过3,最好是答案可以占n列。 问题答案: 测试数据 询问 结果

  • 问题内容: 我的长字符串不适合屏幕的宽度。例如。 为了使阅读更容易,我想到了用这种方式编写它- 但是,我意识到第二种方法使用字符串连接,并会在内存中创建5个新字符串,这可能会导致性能下降。是这样吗 还是编译器足够聪明,以至于我只需要一个字符串就可以了?我如何避免这样做? 问题答案: 我意识到第二种方法使用字符串连接,并将在内存中创建5个新字符串,这可能会导致性能下降。 不,不会。由于这些是字符串文

  • 问题内容: 由于空字符串是Go的零/默认值,因此我决定将所有此类字段定义为。例如 如果该值不适用于该特定字段,则我正在发送数据的应用程序期望使用null而不是空字符串。 这是正确的方法吗?或者有人可以向我指出比这更好的方法。 问题答案: 在json包文档中: 指针值编码为指向的值。nil指针编码为空JSON对象。 因此,您可以存储指向字符串的指针,如果不为nil,则将其编码为字符串;如果为nil,

  • 问题内容: 我在Ruby中有以下代码。我想将此代码转换为JavaScript。JS中的等效代码是什么? 问题答案: 更新: ECMAScript 6(ES6)引入了一种新型的文字,即 模板文字 。它们具有许多功能,其中包括变量插值,但对于这个问题最重要的是,它们可以是多行的。 模板文字由 反引号 分隔: (注意:我不主张在字符串中使用HTML) 浏览器支持还可以,但是您可以使用编译器来更好地兼容。