我正在尝试使用elastica来学习ElasticSearch以连接并查找难以获取的信息,以便了解如何查询它。
所以基本上我要做的是,我已经将数据插入到弹性搜索中,添加了地理坐标,现在我需要做的是能够运行一个查询,它将按最接近的方式对结果进行排序最远。
我想找到我所在州的所有商店,然后按哪个商店最接近我当前的位置订购。
所以给定一个名为“state”的字段和一个名为“point”的字段,这是一个使用elastica持有long / Lat的数组,查询是什么?
感谢您提供的任何帮助。
答案 0 :(得分:1)
首先,您需要将map您的位置字段设置为geo_point
类型(这需要在插入任何数据之前完成)
{
"stores" : {
"properties" : {
"point" : {
"type" : "geo_point"
}
}
}
}
之后,您只需按_geo_distance
{
"sort" : [
{
"_geo_distance" : {
"stores.point" : [-70, 40], // <- reference starting position
"order" : "asc",
"unit" : "km"
}
}
],
"query" : {
"match_all" : {}
}
}
对于Elastica,请查看有关mapping和query building的文档,并阅读单元测试。
答案 1 :(得分:0)
对于那些希望按距离排序的人来说,这个剪切片段详细说明了如何使用自定义分数:
$q = new BoolQuery();
$subQ = new MultiMatchQuery();
$subQ->setQuery('find me')->setFields(array('foo', 'bar'));
$q->addShould($subQ);
$cs = new CustomScore();
$cs->setScript('-doc["location"].distanceInKm(lat,lon)');
$cs->addParams(array(
'lat' => -33.882583,
'lon' => 151.209737
));
$cs->setQuery($q);
希望它有所帮助。