2015-07-16 2 views
0

У меня есть конструктор дескрипторов поиска dynamic. Один из шагов состоит в том, чтобы просмотреть список фильтров диапазона и добавить его в дескриптор поиска. Однако любой запрос диапазона, который я добавляю, перезаписывает предыдущий запрос диапазона. Как я могу добавить диапазон запросов к списку запросов диапазона уже добавилиElasticsearch Nest добавить несколько запросов на диапазон

public SearchDescriptor<dynamic> FilterSearch(SearchDescriptor<dynamic> searchDescriptor, List<FilterField> filters) 
{ 
    foreach (var filter in filters) 
    { 
     searchDescriptor = AddFilterToSearch(searchDescriptor, filter); 
    } 

    return searchDescriptor; 
} 

private static SearchDescriptor<dynamic> AddFilterToSearch(SearchDescriptor<dynamic> searchDescriptor, FilterField filter) 
{ 
    var range = new RangeQuery 
    { 
     Field = filter.Field 
    }; 
    var term = new TermQuery 
    { 
     Field = filter.Field 
    }; 

    string rangeValue = filter.Value == null ? null : JsonConvert.ToString(filter.Value); 

     // trim the quotes that JsonConvert wraps around the value for some reason 
    if (rangeValue != null && rangeValue.StartsWith("\"") && rangeValue.EndsWith("\"")) 
     rangeValue = rangeValue.Substring(1, rangeValue.Length - 2); 

    switch (filter.Operator) 
    { 
     case Enums.ComparrisonOperator.LowerThan: 
      range.LowerThan = rangeValue; 
      break; 
     case Enums.ComparrisonOperator.LowerThanOrEqualTo: 
      range.LowerThanOrEqualTo = rangeValue; 
      break; 
     case Enums.ComparrisonOperator.Equals: 
      if (filter.Value != null && filter.Value is string) 
       filter.Value = filter.Value.ToString().ToLowerInvariant(); 
      term.Value = filter.Value; 
      break; 
     case Enums.ComparrisonOperator.GreaterThan: 
      range.GreaterThan = rangeValue; 
      break; 
     case Enums.ComparrisonOperator.GreaterThanOrEqualTo: 
      range.GreaterThanOrEqualTo = rangeValue; 
      break; 
    } 

    switch (filter.Operator) 
    { 
     case Enums.ComparrisonOperator.LowerThan: 
     case Enums.ComparrisonOperator.LowerThanOrEqualTo: 
     case Enums.ComparrisonOperator.GreaterThan: 
     case Enums.ComparrisonOperator.GreaterThanOrEqualTo: 
      searchDescriptor = searchDescriptor.Query(range); 
      break; 
     case Enums.ComparrisonOperator.Equals: 
      searchDescriptor = searchDescriptor.Query(term); 
      break; 
    } 

    return searchDescriptor; 
} 

ответ

0

Если вы используете НЕСТ я думаю, что вы должны использовать QueryContainer.

var result = _Instance.Search<Record>(s => s 
       .Index("indexName") 
       .Type("type") 
       .Query(q => 
       { 
       QueryContainer query = null; 
       QueryContainer filter1 = null; 
       QueryContainer filter2 = null; 
       QueryContainer filter3 = null; 

       query = q.QueryString(qs=>qs.OnFields(f => f.RecordValue).Query(term)); 

       filter1 = q.Filter(ff => ff.Range(n => n.OnField(f => f.minAge).Lower(20)); 
       filter2 = q.Filter(ff => ff.Range(n => n.OnField(f => f.minAge).Greater(20)); 
       filter3 = q.Filter(ff => ff.Range(n => n.OnField(f => f.maxAge).Lower(60));     

       //You can put some conditions in here so you will 
       switch (filter.Operator) 
       { 
        case Enums.ComparrisonOperator.LowerThan: 
         return query && filter1; 
         break; 
        case Enums.ComparrisonOperator.GreaterThan: 
         return query && filter2; 
         break; 
       } 
       }) 
       .Take(10) 
      ); 

Или что-то в этом роде .... надеюсь, что это поможет! Конечно ... это для Elasticsearch < 2.0

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