elasticsearch functionscore函数中过滤器的elasticsearch嵌套支持
我目前正试图在NEST中实现一个“function_score”查询,其中的函数仅在过滤器匹配时应用 看起来FunctionScoreFunctionsDescriptor还不支持添加过滤器。这项功能很快会被添加吗elasticsearch functionscore函数中过滤器的elasticsearch嵌套支持,elasticsearch,nest,elasticsearch,Nest,我目前正试图在NEST中实现一个“function_score”查询,其中的函数仅在过滤器匹配时应用 看起来FunctionScoreFunctionsDescriptor还不支持添加过滤器。这项功能很快会被添加吗 下面是我希望能够实现的一个超级基本示例: 使用基本分数运行ES查询 遍历函数列表,并将筛选器匹配的第一个分数添加到其中 我目前正在使用Elasticsearch v1.1.0和NEST v1.0.0-beta1预发布版 谢谢 它已经实现了: _client.Search<El
下面是我希望能够实现的一个超级基本示例:
谢谢 它已经实现了:
_client.Search<ElasticsearchProject>(s =>
s.Query(q=>q
.FunctionScore(fs=>fs.Functions(
f=>f
.ScriptScore(ss=>ss.Script("25"))
.Filter(ff=>ff.Term(t=>t.Country, "A")),
f=> f
.ScriptScore(ss=>ss.Script("15"))
.Filter(ff=>ff.Term("a","b")))
.ScoreMode(FunctionScoreMode.first)
.BoostMode(FunctionBoostMode.sum))));
\u客户端搜索(s=>
s、 查询(q=>q
.FunctionScore(fs=>fs.Functions(
f=>f
.ScriptScore(ss=>ss.Script(“25”))
.Filter(ff=>ff.Term(t=>t.Country,“A”),
f=>f
.ScriptScore(ss=>ss.Script(“15”))
.Filter(ff=>ff.Term(“a”、“b”))
.ScoreMode(FunctionScoreMode.first)
.BoostMode(FunctionBoostMode.sum));
Udi的答案对我不起作用。在新版本(v2.3,C#)中,ScoreFunctionsDescriptor
类上似乎没有Filter()方法
但我找到了解决办法。您可以提供一个IScoreFunction
数组。为此,您可以使用新函数scoreFunction()
或使用my helper类:
class CustomFunctionScore<T> : FunctionScoreFunction
where T: class
{
public CustomFunctionScore(Func<QueryContainerDescriptor<T>, QueryContainer> selector, double? weight = null)
{
this.Filter = selector.Invoke(new QueryContainerDescriptor<T>());
this.Weight = weight;
}
}
class CustomFunctionScore:FunctionScoreFunction
T:在哪里上课
{
公共CustomFunctionScore(函数选择器,双权重=null)
{
this.Filter=selector.Invoke(newQueryContainerDescriptor());
这个。重量=重量;
}
}
使用此类,可以通过这种方式应用过滤器(这只是一个示例):
SearchDescriptor SearchDescriptor=新的SearchDescriptor()
.Query(qr=>qr
.FunctionScore(fs=>fs
.Query(q=>q.Bool(b=>b.Should(s=>s.Match)(a=>a.Field(f=>f.FirstName).Query(“john”()()))
.ScoreMode(FunctionScoreMode.Max)
.BoostMode(函数BoostMode.Sum)
.功能(
新[]
{
新的CustomFunctionScore(q=>q.Match(a=>a.Field(f=>f.Id).Query(“my_Id”)),10),
新的CustomFunctionScore(q=>q.Match(a=>a.Field(f=>f.FirstName.Query(“john”)),10),
}
)
)
);
Gah,不知道我怎么会错过这个。我试过了,效果很好。太棒了,谢谢!这是我在最新版本的Nest(2.x及更高版本)中找到的唯一解决方案。但是我们过去可以用逗号分隔多个函数。您提供的解决方案很好,但是添加条件逻辑并不容易,这在我的例子中很重要。
class CustomFunctionScore<T> : FunctionScoreFunction
where T: class
{
public CustomFunctionScore(Func<QueryContainerDescriptor<T>, QueryContainer> selector, double? weight = null)
{
this.Filter = selector.Invoke(new QueryContainerDescriptor<T>());
this.Weight = weight;
}
}
SearchDescriptor<BlobPost> searchDescriptor = new SearchDescriptor<BlobPost>()
.Query(qr => qr
.FunctionScore(fs => fs
.Query(q => q.Bool(b => b.Should(s => s.Match(a => a.Field(f => f.FirstName).Query("john")))))
.ScoreMode(FunctionScoreMode.Max)
.BoostMode(FunctionBoostMode.Sum)
.Functions(
new[]
{
new CustomFunctionScore<BlobPost>(q => q.Match(a => a.Field(f => f.Id).Query("my_id")), 10),
new CustomFunctionScore<BlobPost>(q => q.Match(a => a.Field(f => f.FirstName).Query("john")), 10),
}
)
)
);