我在C#上使用带有Nest 5的Elasticsearch 5.
我有一个看起来像这样的实体:
public class ESMessageRecipients
{
public int MessageId { get; set; }
public int CustomerSiteId { get; set; }
public DateTime CreationDate { get; set; }
public List<string> ContactGuids { get; set; } ....
这样的映射:
client.CreateIndex(indexName, c => c
.Index(indexName)
.Settings(s => s
// Custom analizers
.Analysis(a => a
.Analyzers(an => an
.Custom("default", cas => cas.Tokenizer("keyword").Filters(new string[] { "lowercase", "trim" }))
)
)
)
.Mappings(m => m
.Map<ESMessageRecipients>(map => map.AutoMap())
)
);
我需要更新&#39; ContactGuids&#39;当时收集了成千上万的指南。我试图通过查询语句更新这样做:
...
.Script(s => s
.Inline(@"
if (ctx._source.contactGuids == null) {
ctx._source.contactGuids = new ArrayList();
}
for (int i=0; i < params.guids.length; i++) {
if (!ctx._source.contactGuids.contains(params.guids[i])) {
ctx._source.contactGuids.add(params.guids[i]);
}
}
")
.Lang("painless")
.Params(p => p
.Add("guids", newGuids.ToArray())
)
)
...
但我遇到的问题是,如果我发送一个大的guid列表(比如5k guids),Elastic会抛出异常。我还尝试发送较小的列表(如1k guids),并且它适用于该案例。
以下是5k guid的例外情况:
Content: {"error":{"root_cause":[{"type":"script_exception","reason":"runtime error","script_stack":["for (int ","^---- HERE"],"script":"
脚本是否超出了大小限制? 如果是这种情况,有没有办法增加我可以发送给ES的脚本参数的大小?
这个列表可以有数百万个guid,所以我需要一种方法来使所有这些表现得非常好。