使用ElasticSearch Nest 5.6按布尔值进行脚本排序

时间:2017-12-21 20:38:11

标签: c# .net elasticsearch groovy nest

我有一个使用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 });

哪个应该正确执行...

1 个答案:

答案 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脚本。