elasticsearch functionscore函数中过滤器的elasticsearch嵌套支持,elasticsearch,nest,elasticsearch,Nest" /> elasticsearch functionscore函数中过滤器的elasticsearch嵌套支持,elasticsearch,nest,elasticsearch,Nest" />

elasticsearch functionscore函数中过滤器的elasticsearch嵌套支持

elasticsearch functionscore函数中过滤器的elasticsearch嵌套支持,elasticsearch,nest,elasticsearch,Nest,我目前正试图在NEST中实现一个“function_score”查询,其中的函数仅在过滤器匹配时应用 看起来FunctionScoreFunctionsDescriptor还不支持添加过滤器。这项功能很快会被添加吗 下面是我希望能够实现的一个超级基本示例: 使用基本分数运行ES查询 遍历函数列表,并将筛选器匹配的第一个分数添加到其中 我目前正在使用Elasticsearch v1.1.0和NEST v1.0.0-beta1预发布版 谢谢 它已经实现了: _client.Search<El

我目前正试图在NEST中实现一个“function_score”查询,其中的函数仅在过滤器匹配时应用

看起来FunctionScoreFunctionsDescriptor还不支持添加过滤器。这项功能很快会被添加吗



下面是我希望能够实现的一个超级基本示例:

  • 使用基本分数运行ES查询
  • 遍历函数列表,并将筛选器匹配的第一个分数添加到其中
  • 我目前正在使用Elasticsearch v1.1.0和NEST v1.0.0-beta1预发布版


    谢谢

    它已经实现了:

    _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),
                            }
                        )
                    )
                );