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

问题描述 投票:0回答:1

我有一个使用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”(假),“a.jpg”(真),“b.jpg”(假),“a.jpg”(假)]

预期:[“a.jpg”(假),“b.jpg”(假),“c.jpg”(假),“a.jpg”(真)]

实际:[“a.jpg”(假),“a.jpg”(真),“b.jpg”(假),“c.jpg”(假)]

它几乎就像是以错误的顺序应用排序,但它们是这样添加的:

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# .net elasticsearch groovy nest
1个回答
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脚本。

© www.soinside.com 2019 - 2024. All rights reserved.