我正在使用 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 一切正常,但如果我让它们获取多个位置点,我不会得到相同查询(用户位置)的结果。这发生在相同的查询中,在 django 中直接使用 curl。也就是说,如果我只有一个位置(比如 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
提前致谢
马里奥