2012-10-02 72 views
4

我想知道是否有人在NEST中使用SearchBuilder API的任何提示或示例。文檔仍然有點稀疏。在NEST中使用SearchBuilder ElasticSearch客戶端

我期待根據URL參數中發送的條件動態構建查詢/過濾器。舉個例子:

www.mydomain.com/things/search?prop1=3 & PROP2 = foo的& prop3 =酒吧

一旦我提取那些我想基於標準建立一個精確匹配查詢那是存在的。

回答

0

這是我最後只是:

var boolQuery = QueryFactory.BoolQuery(); 
    if (!String.IsNullOrEmpty(city)) { boolQuery.Must(QueryFactory.TermQuery(ESFields.City, city)); } 
    if (!String.IsNullOrEmpty(state)) { boolQuery.Must(QueryFactory.TermQuery(ESFields.State, state)); } 
    //etc. for many fields 

    var sb = SearchBuilder.Builder(); 
    //I want no actual data - this will ensure I only get IDs 
    sb.Fields(new string[0]); 
    sb.Query(boolQuery); 

    var companyIds = ((ElasticClient)_elasticClient).Search(sb, ESIndexes.Client, ESIndexTypes.Client, tenantId) 
    .DocumentsWithMetaData.Select(d => d.Id).ToList(); 

不知道這是做最有效的/有效的方式,但它的作品。

3

使用DSL查詢語法你現在可以簡單地這樣做:

var results = client.Search(s=>s 
    .Fields(new string[0]) 
    .Query(q=> 
     q.Term(ESFields.City, city) 
     && q.Term(ESFields.State, state) 
    ) 
); 

依賴於0.9.10.0添加conditionless query支持。

如果city保留一個值並且只有狀態項查詢if state不爲空或空,則這將只顯示城市查詢。

  • 如果兩者都有效,將做一個布爾查詢
  • 如果只有一個是有效的它會做只是一個詞語查詢
  • 如果沒有有效將回落到MATCH_ALL查詢。
+0

真棒....感謝Martijn! – Cork

相關問題