2013-08-05 2 views
1

Я пытаюсь реализовать Elasticsearch в моем алгоритме общественного транспорта, чтобы получить данные GTFS, но не знаю, что является «лучшим» способом получения необходимых мне данных (Примечание: I используя NEST в C#).Многопользовательский поиск ElasticSearch NEST C#

Я индексировали 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 в простом запросе (остановка может принадлежать нескольким маршрутам).

В настоящее время я пытаюсь сделать это в 2 этапа, зная, что stop_id могут быть сопоставлены в нескольких StopTimes и несколько trip_id с принадлежат одному route_id (я имею 6k trip_id с для 8 route_id с).

  • Я получаю все данные о 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_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

Если это так, как индексируются ваши данные, звучит так, как ваш первый запрос также должен быть гранью. Вы хотите все trip_ids для stop_id, чтобы вы хотели получить фасет на trip_id (и не возвратили все фактические stoptimes). И тогда следующий запрос - это грань на route_id, как вы указали. Убедитесь, что ваш тип поиска рассчитан для повышения производительности (http://www.elasticsearch.org/guide/reference/api/search/search-type/).

Другой вариант, если trip_id всегда принадлежит к одному маршруту_ид, заключается в использовании отношений между родителями и дочерними элементами между Trips и StopTimes. Вы устанавливаете Trip как родительский элемент StopTime в сопоставлении (http://www.elasticsearch.org/guide/reference/mapping/parent-field/), вы индексируете каждую остановку с поездкой в ​​качестве ее родителя, а затем вы можете использовать запрос или фильтр has_child (http://www.elasticsearch.org/guide/reference/query-dsl/has-child-query/), чтобы принести все Поездки (route_ids) для определенный stop_id.

+0

Спасибо за ответ, я не думал о родителях, я попробую именно так :) – Orelus

Смежные вопросы