1

我正在尝试在我的公共交通算法中实现 Elasticsearch 以获取 GTFS 数据,但不知道获取所需数据的“最佳”方式是什么(注意:我在 C# 中使用 NEST)。

我已经索引了 2 个类:

public class StopTimes : IGTFS
{
     public string trip_id;
     public string arrival_time;
     public string departure_time;
     public string stop_id;
     public string stop_sequence;
     public string stop_headsign;
     public string shape_dist_traveled; 
}

public class Trips : IGTFS
{
    public string route_id;
    public string service_id;
    public string trip_id;
    public string trip_head_sign;
    public string trip_short_name;
    public string direction_id;
    public string shape_id;
}

我想知道如何从 astop_id中获取所有相应的route_id的信息(一个停靠点可以属于几条路线)。

目前,我正在尝试分两步完成,因为我知道 astop_id可以在几个中匹配,StopTimes并且几个trip_ids 属于一个route_id(我有 6k trip_ids 用于 8 route_ids)。

  • 我正在获得匹配的所有StopTimes(超过 2k 次点击)数据stop_id

            var result = _client.Search(s => s
            .Index("gtfs_data")
            .Type("stoptimes")
            .Fields("trip_id")
            .Query(q => q
                .Term("stop_id", id)).Size(10000000)
            );
    
  • 然后我尝试进入route_idTrips 但我真的不知道如何进行(方面?)

        var result2 = _client.Search<Trips>(s => s
                   .Index(_ratpData)
                   .Query(q => q
                   .Terms(t => t.trip_id, terms)) //terms = array of stop_id
                   .FacetTerm(t=>t
                        .OnField(f=>f.route_id).Size(10000000))
                   );
    

谢谢您的帮助 :)

4

1 回答 1

0

如果这是您的数据被索引的方式,听起来您的第一个查询也需要是一个方面 - 您想要一个 stop_id 的所有 trip_id,所以您想要一个关于 trip_id 的方面(而不是带回所有实际的停止时间)。然后下一个查询是您指定的 route_id 上的一个方面。确保将您的搜索类型设置为计数以提高性能(http://www.elasticsearch.org/guide/reference/api/search/search-type/)。

如果trip_id 始终属于单个route_id,另一种选择是使用Trips 和StopTimes 之间的父子关系。您在映射 ( http://www.elasticsearch.org/guide/reference/mapping/parent-field/ )中将 Trip 设置为 StopTime 的父级,将每个 stoptime 索引为行程作为其父级,然后您可以使用 has_child 查询或过滤器 ( http://www.elasticsearch.org/guide/reference/query-dsl/has-child-query/ ) 为某个 stop_id 带来所有 Trips (route_ids)。

于 2013-08-06T09:11:09.650 回答