0

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

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

我想找到我所在州的所有商店,然后按照离我当前位置最近的一家为它们排序。

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

感谢您能给我的任何帮助。

4

2 回答 2

1

首先,您需要将您的位置字段映射为类型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,请查看他们关于映射查询构建的文档,并阅读单元测试。

于 2012-09-23T19:30:27.817 回答
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);

希望能帮助到你。

于 2013-07-29T06:43:09.843 回答