2017-02-03 5 views
0

Я использую клиент NEST со следующим синтаксисом:NEST Aggs коллекция только для чтения

_server.Search<Document>(s => s.Index(_config.SearchIndex) 
.Query(q => q.MatchAll(p => p)).Aggregations(
    a => a 
    .Terms("type", st => st 
     .Field(p => p.Type) 
    ))); 

Однако я получаю следующее исключение

A first chance exception of type 'System.NotSupportedException' occurred in mscorlib.dll 

    Additional information: Collection is read-only. 

Это только, кажется, происходит, когда я м с использованием скоплений, поле Тип имеет следующее отображение:

[Keyword(Name = "Type")] 
    public string Type { get; set; } 
+0

Можете ли вы сказать мне, как вы обращаетесь к результату и вы пытаетесь изменить объект результата? – pratikvasa

+0

Какую версию NEST вы используете, и какую версию Elasticsearch вы настраиваете? –

+0

у меня такая же проблема .. можно понять это. проблема заключается в десериализации ответа. Исключения происходят в JSON.NET. @Imran Азад, как вы в итоге решили это? –

ответ

0

Я бы дважды проверял версии N EST и Elasticsearch.Net, которые вы используете. Я просто попытался следующий пример с Elasticsearch 5.1.2 и 5.0.1 НЕСТ и не видеть проблему

void Main() 
{ 
    var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200")); 
    var defaultIndex = "default-index"; 
    var connectionSettings = new ConnectionSettings(pool) 
      .DefaultIndex(defaultIndex); 

    var client = new ElasticClient(connectionSettings); 

    if (client.IndexExists(defaultIndex).Exists) 
     client.DeleteIndex(defaultIndex); 

    client.CreateIndex(defaultIndex, c => c 
     .Mappings(m => m 
      .Map<Document>(mm => mm.AutoMap()) 
     ) 
    ); 

    var documents = Enumerable.Range(1, 100).Select(i => 
     new Document 
     { 
      Type = $"Type {i % 5}" 
     } 
    ); 

    client.IndexMany(documents); 

    client.Refresh(defaultIndex); 

    var searchResponse = client.Search<Document>(s => s 
     .Index(defaultIndex) 
     .Query(q => q.MatchAll(p => p)) 
     .Aggregations(a => a 
      .Terms("type", st => st 
       .Field(p => p.Type) 
      ) 
     ) 
    ); 

    foreach (var bucket in searchResponse.Aggs.Terms("type").Buckets) 
     Console.WriteLine($"key: {bucket.Key}, count {bucket.DocCount}"); 
} 

public class Document 
{ 
    [Keyword(Name = "Type")] 
    public string Type { get; set; } 
} 

это выводит

key: Type 0, count 20 
key: Type 1, count 20 
key: Type 2, count 20 
key: Type 3, count 20 
key: Type 4, count 20 
+0

Огромное вам спасибо, я не знаю, что я сделал, но, похоже, сейчас работает! –

 Смежные вопросы

  • Нет связанных вопросов^_^