This is the indexing code. Specifically the City field is a Multi field for searching and aggregation. Using a few analyzers also. Only the City field needs to be aggregated.
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)
)))
.....
I am aggregating it like this...
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;
}
The terms.Buckets is always empty. How to get the aggregated values for the cities here? I am using ES 5.5.0