如何使用NEST 2.x将c#对象列表存储到ElasticSearch中

时间:2016-10-08 11:16:31

标签: c# elasticsearch nest

我正在使用xamarin.forms开发一个跨平台的应用程序,我正在尝试寻找一种方法将对象列表直接存储到ElasticSearch中,以便稍后我可以根据列表的对象搜索结果。我的情景是愚蠢的:

public class Box {

    [String(Index = FieldIndexOption.NotAnalyzed)]
    public string id { get; set; }

    public List<Category> categories { get; set; }
}


public class Category {

    [String(Index = FieldIndexOption.NotAnalyzed)]
    public string id { get; set; }

    public string name { get; set; }
}

我的目标是能够搜索具有特定类别的所有框。

我试图像the documentation中所说的那样正确映射所有内容,但如果我这样做,当我存储一个盒子时,它只存储第一个类别。

有没有办法做到这一点,还是NEST不可能?

非常欢迎任何提示!

由于

1 个答案:

答案 0 :(得分:1)

使用文档中的代码可以正常使用AutoMap:

如果索引不存在:

var descriptor = new CreateIndexDescriptor("indexyouwant") .Mappings(ms => ms .Map<Box>(m => m.AutoMap()) );

然后调用类似的东西:

await client.CreateIndexAsync(descriptor).ConfigureAwait(false);

或者,当不使用异步时:

client.CreateIndex(descriptor);

如果索引已存在

然后忘记在上面创建CreateIndexDescriptor部分,只需调用:

await client.MapAsync<Box>(m => m.Index("existingindexname").AutoMap()).ConfigureAwait(false);

或者,当不使用异步时:

client.Map<Box>(m => m.Index("existingindexname").AutoMap());

成功创建类型的映射后,您可以索引文档。

您是否有可能首先在一个框中只有一个类别并将其映射到索引(在您创建列表之前)?因为那时你必须手动编辑我猜的映射,例如在Sense中。

我不知道您的索引中是否已有重要数据,但您也可以删除整个索引(映射也将被删除)并再次尝试。但是,您将丢失已在整个索引中编入索引的所有文档。

相关问题