2015-09-10 80 views
0

我無法從Elasticsearch.NET API獲取正確的elasticsearch查詢字符串。這是我想生成的查詢:使用Elasticsearch.NET重新創建elasticsearch過濾查詢

我用來獲取如下
{ 
    "size": 5000, 
    "sort": [ 
     { 
     "id": { 
      "order": "desc" 
     } 
     } 
    ], 
    "query": { 
     "filtered": { 
     "query": { 
      "bool": { 
       "must": [ 
        { 
        "match_all": {} 
        }, 
        { 
        "term": { 
         "stateType": { 
          "value": 2 
         } 
        } 
        } 
       ] 
      } 
     }, 
     "filter": { 
      "or": [ 
       { 
        "term": { 
        "concealed": true 
        } 
       }, 
       { 
        "term": { 
        "govt": true 
        } 
       } 
      ] 
     } 
     } 
    } 
} 

的C#代碼:

FilterContainer filterContainer = new FilterContainer(); 

filterContainer &= Filter<ElasticsearchLoad>.Or(f => f.Term("concealed", true)); 
filterContainer &= Filter<ElasticsearchLoad>.Or(f => f.Term("govt", true)); 

QueryContainer container = new MatchAllQuery(); 
container &= Query<ElasticsearchLoad>.Filtered(fq => Query<ElasticsearchLoad>.Term(l => l.StateType, 2)); 

SearchDescriptor<ElasticsearchLoad> searchDescriptor = new SearchDescriptor<ElasticsearchLoad>(); 
searchDescriptor.Query(container).Filter(filterContainer); 
searchDescriptor.Size(5000); 

var searchResponse = Client.Search<ElasticsearchMyDoc>(s => searchDescriptor); 

正如你所看到的,我沒有收到「查詢」 :{「filtered」:{...}}語法被生成,並且,對於我而言,我無法弄清楚如何。有人可以幫助我確定實現此目標所需的C#語法嗎?

謝謝!

回答

3

你缺少的是如何使用Nest構建過濾的查詢。請參閱下面的解決方案除此之外,我建議你使用boolean過濾器(如我以下所做的)而不是and/or過濾器,因爲過濾器通常被緩存,因此執行速度非常快。閱讀this

FilterContainer filterContainer = null; 

filterContainer |= Filter<ElasticsearchMyDoc>.Term("concealed", true); 
filterContainer |= Filter<ElasticsearchMyDoc>.Term("govt", true); 

QueryContainer queryContainer = new MatchAllQuery(); 
queryContainer &= Query<ElasticsearchMyDoc>.Term(l => l.StateType, 2); 

SearchDescriptor<ElasticsearchMyDoc> searchDescriptor = new SearchDescriptor<ElasticsearchMyDoc>(); 
searchDescriptor.Query(qd => qd.Filtered(fq => 
    { 
     fq.Filter(f => filterContainer); 
     fq.Query(q => queryContainer); 
    })); 

searchDescriptor.Size(5000); 
var searchResponse = Client.Search<ElasticsearchMyDoc>(s => searchDescriptor); 
+0

這正是我一直在尋找的。謝謝!感謝您幫助我更好地理解Elasticsearch.NET API! –

3

希望你不介意我用過流利的語法。

var searchResponse = client.Search<Person>(s => s 
    .Size(5000) 
    .Sort(x => x.OnField(f => f.Id).Descending()) 
    .Query(query => query 
     .Filtered(filtered => filtered 
      .Query(q => q.Bool(b => b.Must(
       m => m.MatchAll(), 
       m => m.Term(t => t.OnField(f => f.StateType).Value("2"))))) 
      .Filter(filter => filter.Or(
       f => f.Term(t => t.Concealed, true), 
       f => f.Term(t => t.Govt, true)))))); 

希望它有幫助。

+0

羅布,哇,謝謝!我已經插入它,它完美的作品!問題是它使用流利的語法,並且我需要它來使用查詢容器,等等,因爲查詢是由用戶輸入構建的。這有可能使用OIS語法。如果是這樣,你能幫忙嗎?我是新來的,這顯然不是爲我點擊: -/ –

相關問題