我使用Elasticsearch.Net& amp;编写了一些代码。 NEST客户端库应该索引文档而不使用POCO来映射字段,因为我有许多不同的文档。
问题1)这是创建索引的正确方法吗,.AddMapping<string>(mapping => mapping.Dynamic(true))
是否根据传入的文档创建映射?
var newIndex = client.CreateIndex(indexName, index => index
.NumberOfReplicas(replicas)
.NumberOfShards(shards)
.Settings(settings => settings
.Add("merge.policy.merge_factor", "10")
.Add("search.slowlog.threshold.fetch.warn", "1s")
)
.AddMapping<string>(mapping => mapping.Dynamic(true))
);
问题2)这可能吗?
string document = "{\"name\": \"Mike\"}";
var newIndex = client.Index(document, indexSelector => indexSelector
.Index(indexName)
);
当我在“问题2”中运行代码时,它返回:
{"Unable to perform request: 'POST ' on any of the nodes after retrying 0 times."}
答案 0 :(得分:2)
NEST仅处理类型化对象,在这种情况下,传递一个字符串将导致它将文档索引到/{indexName}/string/{id}
。
由于它无法从字符串中推断出一个id而你没有通过它,因此它会失败,或者它无法序列化一个字符串。在这种情况下,我会更新客户端以引发更好的例外。
如果要将文档索引为字符串,请使用公开的Elasticsearch.NET
客户端,如下所示:
client.Raw.Index(indexName, typeName, id, stringJson);
如果您希望elasticsearch能够提供ID,您可以使用
client.Raw.Index(indexName, type, stringJson);
client
是NEST
客户端,Raw
属性是Elasticsearch.Net
客户端,具有相同的连接设置。
请注意,我可能会在下一次测试版更新中使用Raw
重命名LowLevel
,但仍在辩论。