在ElasticSearch + Django-Haystack中使用多个位置字段

时间:2012-06-30 13:38:25

标签: django elasticsearch django-haystack

我正在使用django-haystack和ElasticSearch来索引商店。

到目前为止,每个商店都有一个纬度,长坐标对;我们不得不改变它来代表一个商店可以将产品送到不同地区(分离)的事实我已经为他们添加了十个地点(纬度,长对)。

当使用一个位置字段时,一切正常,我得到了正确的结果。现在,对于相同的用户和商店坐标,对于多个位置字段,我无法获得任何结果,甚至是前一个结果。

我的索引如下:

class StoreIndex(indexes.SearchIndex,indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True,
                         template_name='search/indexes/store/store_text.txt')
    location0 = indexes.LocationField()
    location1 = indexes.LocationField()   
    location2 = indexes.LocationField()
    location3 = indexes.LocationField()
    location4 = indexes.LocationField()
    location5 = indexes.LocationField()
    location6 = indexes.LocationField()
    location7 = indexes.LocationField()
    location8 = indexes.LocationField()
    location9 = indexes.LocationField()

    def get_model(self):
        return Store

    def prepare_location0(self, obj):
        # If you're just storing the floats...
        return "%s,%s" % (obj.latitude, obj.longitude)

    # .....   up to prepare_location9
    def prepare_location9(self, obj):
        # If you're just storing the floats...
        return "%s,%s" % (obj.latitude_9, obj.longitude_9) 

这是构建索引的正确方法吗?

从elasticsearch我得到这个映射信息:

curl -XGET http://localhost:9200/stores/_mapping?pretty=True
{
  "stores" : {
    "modelresult" : {
      "properties" : {
    "django_id" : {
      "type" : "string"
    },
    "location0" : {
      "type" : "geo_point",
      "store" : "yes"
    },
    "location1" : {
      "type" : "geo_point",
      "store" : "yes"
    },
    "location2" : {
      "type" : "geo_point",
      "store" : "yes"
    },
    "location3" : {
      "type" : "geo_point",
      "store" : "yes"
    },
    "location4" : {
      "type" : "geo_point",
      "store" : "yes"
    },
    "location5" : {
      "type" : "geo_point",
      "store" : "yes"
    },
    "location6" : {
      "type" : "geo_point",
      "store" : "yes"
    },
    "location7" : {
      "type" : "geo_point",
      "store" : "yes"
    },
    "location8" : {
      "type" : "geo_point",
      "store" : "yes"
    },
    "location9" : {
      "type" : "geo_point",
      "store" : "yes"
    },
    "text" : {
      "type" : "string",
      "analyzer" : "snowball",
      "store" : "yes",
      "term_vector" : "with_positions_offsets"
    }
  }
  } 
 }
}

然后,我尝试以这种方式查询:

sqs0 = SearchQuerySet().dwithin('location0', usuario, max_dist).distance('location0',usuario).using('stores')

其中:

usuario 是一个Point实例,表示用户试图在他的位置附近找到商店并

max_dist 是D实例。

如果我直接查询,使用curl我也没有结果。

以下是使用curl查询多个位置字段的结果:

$ curl -XGET http://localhost:9200/stores/modelresult/_search?pretty=true -d '{  "query" : { "match_all": {} },  "filter" : {"geo_distance" : { "distance" : "6km", "location0" : { "lat" : -23.5,  "lon" : -46.6 } } } } '
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
  "total" : 0,
  "max_score" : null,
  "hits" : [ ]
  }
}

如果注释掉StoreIndex类中的字段location1-9,一切正常,但是如果我让它们获得多个位置点,我得不到相同查询(用户位置)的结果。这种情况发生在同一个查询中,使用curl直接在django中。也就是说,如果我只有一个位置(比如location0),则两个查询都会返回正确的结果。有了更多的位置(location0-9),两个查询都没有给出任何结果。

以下是仅使用一个位置字段直接使用curl查询的结果:

 $ curl -XGET http://localhost:9200/stores/modelresult/_search?pretty=true -d '{     "query" : { "match_all": {} },  "filter" : {"geo_distance" : { "distance" : "6km", "location0" : { "lat" : -23.5,  "lon" : -46.6 } } } } '
{
"took" : 3,
"timed_out" : false,
"_shards" : {
  "total" : 5,
  "successful" : 5,
  "failed" : 0
 },
"hits" : {
  "total" : 9,
  "max_score" : 1.0,
  "hits" : [ {
    "_index" : "stores",
    "_type" : "modelresult",
    "_id" : "store.store.110",
    "_score" : 1.0, "_source" : {"django_ct": "store.store", "text": "RESULT OF THE SEARCH \n\n", "django_id": "110", "id": "store.store.110", "location0": "-23.4487554,-46.58912"}
  },
  lot's of results here
   ]
  }
 }

当然,我在StoreIndex发生任何变化后都会重新构建。

有关如何使用elasticsearch和django获取多个位置字段的任何帮助吗?

PS。:我已经在Django-Haystack和ElasticSearch Google Groups上发布了这个问题。

https://groups.google.com/d/topic/elasticsearch/85fg7vdCBBU/discussion

https://groups.google.com/d/topic/django-haystack/m2A3_SF8-ls/discussion

提前致谢

马里奥

0 个答案:

没有答案