2016-12-29 57 views
1

巢彈性搜索5.1,我想能夠做一個基本的AGGS相當於它的工作原理是HTTP的直接請求:嵌套用於彈性搜索5.1如何使基本的aggs?

POST /base_well/person/_search 
{ 
    "aggs": { 
     "all_words" : { 
      "terms" : { 
       "field" : "Age"     
      } 
     } 
    } 
} 

它給我這樣的answere:

{ 
    "took": 22, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 4, 
     "max_score": 1, 
     "hits": [ 
     { 
      "_index": "base_well", 
      "_type": "person", 
      "_id": "AVlMAnskcR_Z5VPUXUCs", 
      "_score": 1, 
      "_source": { 
       "first_name": "Polo", 
       "last_name": "Rodriguez", 
       "Age": 36 
      } 
     }, 
     { 
      "_index": "base_well", 
      "_type": "person", 
      "_id": "AVlMAo0NcR_Z5VPUXUCu", 
      "_score": 1, 
      "_source": { 
       "first_name": "Mustapha", 
       "last_name": "Bulutu M'Bo", 
       "Age": 26 
      } 
     }, 
     { 
      "_index": "base_well", 
      "_type": "person", 
      "_id": "AVlMAnPFcR_Z5VPUXUCr", 
      "_score": 1, 
      "_source": { 
       "first_name": "James", 
       "last_name": "Mopo", 
       "Age": 21 
      } 
     }, 
     { 
      "_index": "base_well", 
      "_type": "person", 
      "_id": "AVlMAoO8cR_Z5VPUXUCt", 
      "_score": 1, 
      "_source": { 
       "first_name": "Marc Aurelien", 
       "last_name": "Poisson", 
       "Age": 26 
      } 
     } 
     ] 
    }, 
    "aggregations": { 
     "all_words": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
      { 
       "key": 26, 
       "doc_count": 2 
      }, 
      { 
       "key": 21, 
       "doc_count": 1 
      }, 
      { 
       "key": 36, 
       "doc_count": 1 
      } 
     ] 
     } 
    } 
} 

我這樣做C#巢嘗試:

public class Person 
    { 
     public string first_name {get;set;} 
     public string last_name { get; set; } 
     public int Age { get; set; } 
    } 

var uri = new Uri("http://localhost:9200"); 
    var setting = new ConnectionSettings(uri); 
    setting.DisableDirectStreaming(true); 
    setting.DefaultIndex("base_well"); 
    var Client = new ElasticClient(setting); 


    var response = Client.Search<Person>(s => s 
             .Type("person") 
             .Aggregations(p => p 
             .Terms(ageCodeAggregation, m => m 
             .Field(f => f.Age)))); 

但它給我一個空的結果:

enter image description here

我給你品嚐上下文:

我創建的索引與製圖:

PUT /base_well 
{ 
    "mappings": { 
     "person": { 
       "properties": { 
        "first_name":{ 
         "type": "string", 
         "store": true 
        }, 
        "last_name":{ 
         "type": "string", 
         "store": true 
        }, 
        "Age":{ 
         "type": "long", 
         "store": true 
        } 
       } 
     } 
    } 
} 

我填充:

POST /base_well/person 
     { 
      "first_name":"James", 
      "last_name" : "Mopo", 
      "Age" : 21 
     } 

    POST /base_well/person 
    { 
     "first_name":"Polo", 
     "last_name" : "Rodriguez", 
     "Age" : 36 
    } 

    POST /base_well/person 
    { 
     "first_name":"Marc Aurelien", 
     "last_name" : "Poisson", 
     "Age" : 26 
    } 

    POST /base_well/person 
    { 
     "first_name":"Mustapha", 
     "last_name" : "Bulutu M'Bo", 
     "Age" : 26 
    } 

任何人都可以解釋我這樣做,並它是如何工作的?

回答

1

當序列化C#POCO屬性名稱並將它們發送到Elasticsearch時,NEST默認情況下會生成字段名稱。因此,.Field(f => f.Age)將序列化爲"age",但Elasticsearch中的字段爲"Age",因此不會返回結果。

爲了改變字段名稱序列化行爲,你可以在ConnectionSettings

var uri = new Uri("http://localhost:9200"); 
var setting = new ConnectionSettings(uri) 
    .DefaultFieldNameInferrer(s => s) 
    .DefaultIndex("base_well"); 

var client = new ElasticClient(setting); 

傳遞一個委託DefaultFieldNameInferrer()既然你想讓你的POCO屬性名稱發送到Elasticsearch字段名逐字反映,委託返回屬性名稱以用作字段名稱的字符串。

+0

謝謝您的提示!但它的工作方式與你的解決方法一樣,甚至在任何地方都可以用年齡代替(在人員類別和代碼中) –

+0

對不起,你是對的,非常感謝你,沒有很多人能夠回答關於這個話題 –