多类型ElasticSearch搜索请求NEST C#

时间:2013-08-05 19:01:00

标签: c# elasticsearch nest

我正在尝试在我的公共传输算法中实现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))
                   );
    

感谢您的帮助:)

1 个答案:

答案 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。