2016-05-10 3 views
1

Я новичок в ElasticSearch, и я использую NEST для запуска моих запросов. Мне нужно иметь возможность добавить X количество фильтрующих терминов в мой запрос.C# Nest - ElasticSearch

На данный момент мой запрос выглядит следующим образом:

var page = new Page 
{ 
    Id = 1, 
    Name = "JR-11 Hyper black" 
}; 

var tags = new Dictionary<string, string[]> 
{ 
    { "Size", new[] { "16", "17", "18" }}, 
    { "Color", new[] { "Bronze", "Hyper Black", "Flat Black" }} 
}; 

page.Tags = tags; 

ElasticClient.Index(page, idx => idx.Index("pages")); 

var result = ElasticClient.Search<Page>(
    body => body.Query(query => query.ConstantScore(
     csq => csq.Filter(filter => filter.Term("tags.Size", "17")))) 
    .Take(1000)); 

var pages = result.Documents.ToList(); 

Проблема у меня есть с csq.Filter(filer => filter.Term("tags.Storlek")

мне нужно, чтобы иметь возможность добавить динамическое количество таких фильтров. Не могу найти ничего в документации для версии 2.3, которую я использую.

ответ

0

Fluent API должен позволять что-то вроде этого:

string[] filterTerms = { ... }; 

var result = ElasticClient.Search<Page>(
    body => body.Query(query => query.ConstantScore(
    csq => 
    { 
     var combinedFilters = csq.Filter(filter => filter.Term("tags.Size", "17")); 

     // add an additional, dynamic amount of filters 
     foreach (string filterTerm in filterTerms) 
      combinedFilters = combinedFilters.Filter(filter => filter.Term(filterTerm, ...)); 

     return combinedFilters; 
    })) 
    .Take(1000)); 
+0

Спасибо! Но что должны содержать фильтры? И не следует ли объединять фильтры в какой-то части? Вместо того, чтобы перезаписывать внутри петли? –

+0

Ну, 'filterTerm' определяется вами, конечно. Вы хотите динамическое количество фильтров, так что вы определяете их. «Комбинированные фильтры» перезаписаны, да, но с объектом, который содержит уже определенные фильтры, а также недавно добавленный фильтр. Часто реализации фактически возвращают один и тот же объект. См. Https://en.wikipedia.org/wiki/Fluent_interface для получения дополнительной информации о свободном интерфейсе. –

0

Я закончил с этим, кажется, работает, как нужно :)

var result = ElasticClient.Search<Page>(
      body => body.Query(query => query.ConstantScore(csq => csq.Filter(f => 
      { 
       var ff = f.Term("tags.Size", "17"); 

       // This will be replaced with a loop containing filter terms 
       ff &= f.Term("tags.Size", "16"); 
       ff &= f.Term("tags.Size", "19"); 

       return ff; 
      }))).Take(1000)); 

Спасибо за ваш ответ, который получил меня в правом направление Thomas :)

+0

Вы можете найти документацию по запросу 'bool' - https://www.elastic.co/guide/en/elasticsearch/client/net-api/2.x/bool-queries.html –

+0

вы должны взглянуть в контейнерах запросов :) – danvasiloiu

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