我正在尝试在我的公共传输算法中实现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;
}
我想知道如何从stop_id
中获取一个简单请求中的所有相应route_id
(一个停靠点可以属于多个路径)。
目前,我尝试分两步完成,知道stop_id
可以匹配多个StopTimes
而多个trip_id
属于一个route_id
(对于8 trip_id
s,我有6k route_id
s。
我收到StopTimes
匹配的所有stop_id
(超过2k点击)数据。
var result = _client.Search(s => s
.Index("gtfs_data")
.Type("stoptimes")
.Fields("trip_id")
.Query(q => q
.Term("stop_id", id)).Size(10000000)
);
然后我尝试在旅行中获得route_id
,但我真的不知道如何继续(方面?)
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))
);
感谢您的帮助:)
答案 0 :(得分:0)
如果这是您的数据索引的方式,那么您的第一个查询的声音也需要是一个方面 - 您希望所有trip_id都是stop_id,因此您需要trip_id上的一个方面(并且不会带回所有实际的停止时间) )。 然后下一个查询是您指定的route_id上的一个方面。 请务必将搜索类型设置为计数以提高效果(http://www.elasticsearch.org/guide/reference/api/search/search-type/)。
另一个选项,如果trip_id始终属于单个route_id,则使用Trips和StopTimes之间的父子关系。您将Trip设置为映射(http://www.elasticsearch.org/guide/reference/mapping/parent-field/)中StopTime的父级,您将每次停止时间作为其父级的索引进行索引,然后您可以使用has_child查询或过滤器(http://www.elasticsearch.org/guide/reference/query-dsl/has-child-query/)来将所有Trips(route_ids)带到某个stop_id。