2017-09-20 12 views
0

이것은 인덱싱 코드입니다. 특히 City 필드는 검색 및 집계를위한 다중 필드입니다. 몇 개의 분석기도 사용하십시오. 도시 필드 만 집계해야합니다.ElasticSearch C# 클라이언트 (NEST) : ES 5.5.0을 사용하여 집계 결과를 얻으려면

 client.CreateIndex(IndexName, c => c 
     .Settings(s => s 
     .Analysis(a => a 
     .Analyzers(an => an 
     .Custom("index_analyzer", ca => ca 
     .Tokenizer("standard") 
     .Filters("standard", "lowercase", "stop")) 
     .Custom("search_analyzer", ca => ca 
     .Tokenizer("standard") 
     .Filters("standard", "lowercase", "stop")) 
     ) 
     ) 
     ) 
     .Mappings(m => m 
     .Map<EmployeeInfo>(mm => mm 
     .AutoMap() 
     .Properties(p => p 
     .Text(t => t 
     .Name(n => n.Employee_Num) 
     .Analyzer("index_analyzer") 
     .SearchAnalyzer("search_analyzer")) 
     .Text(t => t 
     .Name(n => n.First_Name) 
     .Analyzer("index_analyzer") 
     .SearchAnalyzer("search_analyzer")) 
     .Text(t => t 
     .Name(n => n.Last_Name) 
     .Analyzer("index_analyzer") 
     .SearchAnalyzer("search_analyzer")) 
     .Text(t => t 
     .Name(n => n.Address) 
     .Analyzer("index_analyzer") 
     .SearchAnalyzer("search_analyzer")) 
     .Text(t => t 
     .Name(n => n.City) 
     .Fields(f => f 
     .Text(tt => tt 
     .Name("mytext") 
     .Analyzer("index_analyzer") 
     .SearchAnalyzer("search_analyzer")) 
     .Keyword(k => k 
     .Name("keyword") 
     .IgnoreAbove(256) 
     ))) 

.....

내가 ... 이런 식으로 terms.Buckets을

  var result = client.Search<EmployeeInfo>(s => s 
       .Index("employee") 
       .Aggregations(a => a 
       .Terms("field1", t => t.Field(k => k.City.Suffix("keyword")) 
       .MinimumDocumentCount(2) 
       .Size(100) 
       .ExecutionHint(TermsAggregationExecutionHint.Map)) 
       ) 
       ); 

      bool valid = result.IsValid; 
      var dataList = new List<Tuple<string, long>>(); 

      var terms = result.Aggs.Terms("field1"); 

      if (terms != null) 
      { 
       foreach (var bucket in terms.Buckets) 
       { 
        string data = bucket.Key; 
        long count = (long)bucket.DocCount; 

        dataList.Add(new Tuple<string, long>(data, count)); 
       } 


       // To Sort by Alphabets 
       if (sortAlphbetically) 
        return dataList.OrderBy(t => t.Item1).ToList(); 

       // To Sort by count 
       return dataList.OrderByDescending(t => t.Item2).ToList(); 
      } 

      return dataList; 
     } 

그것을 집계하고 항상 비어 있습니다. 여기에 도시에 대한 집계 값을 얻는 방법? ES 5.5.0

+0

''IndexName'은''employee "'입니까? –

+0

예, INdexName은 employee입니다. –

답변

0

답변을 얻은 후 색인 생성에 문제가 발생했습니다. 해결 방법을 찾아 냈습니다. 다음과 같이 인덱싱을 수행합니다.

 client.CreateIndex(IndexName, i => i 
     .Settings(s => s 
      .Analysis(a => a 
       .TokenFilters(tf => tf 
        .EdgeNGram("edge_ngrams", e => e 
         .MinGram(1) 
         .MaxGram(50) 
         .Side(EdgeNGramSide.Front))) 
        .Analyzers(analyzer => analyzer 
         .Custom("partial_text", ca => ca 
          .Filters(new string[] { "lowercase", "edge_ngrams" }) 
          .Tokenizer("standard")) 
         .Custom("full_text", ca => ca 
          .Filters(new string[] { "standard", "lowercase" }) 
          .Tokenizer("standard"))))) 

          .Mappings(m => m 
          .Map<EmployeeInfo>(mm => mm 
          .AutoMap() 
          .Properties(p => p 
          .Text(t => t 
          .Name(n => n.Employee_Num) 
          .Analyzer("partial_text") 
          .SearchAnalyzer("full_text")) 
          .Text(t => t 
          .Name(n => n.First_Name) 
          .Analyzer("partial_text") 
          .SearchAnalyzer("full_text")) 
          .Text(t => t 
          .Name(n => n.Last_Name) 
          .Analyzer("partial_text") 
          .SearchAnalyzer("full_text")) 
          .Text(t => t 
          .Name(n => n.Address) 
          .Analyzer("partial_text") 
          .SearchAnalyzer("full_text")) 
          .Text(t => t 
          .Name(n => n.City) 
          .Fields(f => f 
          .Text(tt => tt 
          .Name("mytext") 
          .Analyzer("partial_text") 
          .SearchAnalyzer("full_text")) 
          .Keyword(k => k 
          .Name("keyword") 
          .IgnoreAbove(256) 
          ))) 

          )))