我有一个使用Nest的ElasticSearch 5.6中的对象具有以下属性:
[Object(Name = "UserFlags")]
public List<long> UserFlags { get; set; }
我有一个脚本排序,它按以下方式使用此字段:
sorts.Add(new ScriptSort
{
Type = "boolean",
Order = SortOrder.Ascending,
Script = new InlineScript("doc['UserFlags'].value.indexOf(userID) > -1")
{
Lang = "groovy",
Params = new Dictionary<string, object>
{
{ "userID", user.ID }
}
}
});
此脚本始终抛出异常并且无法排序(由于脚本存在某些问题,因此无法返回结果)。按其他属性排序工作正常,甚至其他脚本排序也按预期工作:
sorts.Add(new ScriptSort
{
Order = SortOrder.Ascending,
Type = "number",
Script = new InlineScript("doc['TotalGalleryCount'].value - doc['ClosedGalleryCount'].value")
});
我做错了什么? Nest文档非常稀疏。
修改
如果我将脚本修改为:
sorts.Add(new ScriptSort
{
Type = "string",
Order = SortOrder.Ascending,
Script = new InlineScript(string.Format("doc['UserFlags'].values.contains({0})", user.ID))
});
然后脚本执行,我得到结果。但是,在我的单元测试中,排序似乎并没有影响结果。 (请注意,在脚本排序后会发生另外的排序sorts.Add(new SortField { Field = "Filename", Order = SortOrder.Ascending });
。)
输入:[“c.jpg”(false),“a.jpg”(true),“b.jpg”(false),“a.jpg”(false)] < / p>
预期:[“a.jpg”(false),“b.jpg”(false),“c.jpg”(false),“a.jpg”(true)] < / p>
实际:[“a.jpg”(假),“a.jpg”(真),“b.jpg”(假),“c.jpg”(假)] < / p>
这几乎就像是以错误的顺序应用排序,但它们是这样添加的:
sorts.Add(new ScriptSort
{
Type = "string",
Order = SortOrder.Ascending,
Script = new InlineScript(string.Format("doc['UserFlags'].values.contains({0})", user.ID))
});
sorts.Add(new SortField { Field = "Filename", Order = SortOrder.Ascending });
哪个应该正确执行...
答案 0 :(得分:0)
因此,在从groovy切换到无痛,并尝试了一堆内置的无痛功能(这不起作用)之后,我的最终解决方案是:
//HACK: Yes, this is ugly, but painless does not like the contains() or indexOf() functions
var script = "for (int i = 0; i < doc['UserFlags'].values.length; i++) if (doc['UserFlags'].values[i] == {0}) return true; return false;";
script = string.Format(script, user.ID);
sorts.Add(new ScriptSort
{
Type = "string",
Order = defaultOrder,
Script = new InlineScript(script)
});
sorts.Add(new SortField { Field = "Filename", Order = determinedOrder });
我们使用无痛而不是groovy,因为我们的服务器不允许使用groovy脚本。