【问题标题】:Sorting results based on location using elastica使用 elastica 根据位置对结果进行排序
【发布时间】:2012-09-14 21:15:00
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: elasticsearch elastica


    【解决方案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 的文档,并阅读单元测试。

    【讨论】:

      【解决方案2】:

      对于那些想要按距离排序的人,这个精简的 sn-p 详细说明了如何使用自定义分数:

          $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);
      

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-02
        • 2014-12-02
        • 1970-01-01
        • 1970-01-01
        • 2012-04-12
        • 2018-08-13
        • 1970-01-01
        相关资源
        最近更新 更多