使用elastica基于位置对结果进行排序

时间:2012-09-22 20:52:46

标签: elasticsearch elastica

我正在尝试使用elastica来学习ElasticSearch以连接并查找难以获取的信息,以便了解如何查询它。

所以基本上我要做的是,我已经将数据插入到弹性搜索中,添加了地理坐标,现在我需要做的是能够运行一个查询,它将按最接近的方式对结果进行排序最远。

我想找到我所在州的所有商店,然后按哪个商店最接近我当前的位置订购。

所以给定一个名为“state”的字段和一个名为“point”的字段,这是一个使用elastica持有long / Lat的数组,查询是什么?

感谢您提供的任何帮助。

2 个答案:

答案 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,请查看有关mappingquery 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);

希望它有所帮助。