Search code examples
c#.netelasticsearchnestelasticsearch.net

How create the filters in Function Score Query with .NET NEST Client


In Elasticsearch Document describe about Function Score Query show code as below

GET /_search
{
    "query": {
        "function_score": {
          "query": { "match_all": {} },
          "boost": "5", 
          "functions": [
              {
                  "filter": { "match": { "test": "bar" } },
                  "random_score": {}, 
                  "weight": 23
              },
              {
                  "filter": { "match": { "test": "cat" } },
                  "weight": 42
              }
          ],
          "max_boost": 42,
          "score_mode": "max",
          "boost_mode": "multiply",
          "min_score" : 42
        }
    }
}

I write this query to object initializer syntax

var searchRequest = new SearchRequest<ProductType>
{
   Query = new FunctionScoreQuery()
   {
      Query = new MatchAllQuery {},
      Boost = 5,
      Functions = new List<IScoreFunction>
      {
         Filters...?
      },
      MaxBoost = 42,
      ScoreMode = FunctionScoreMode.Max,
      BoostMode = FunctionBoostMode.Max,
      MinScore = 42
   }
};

How to build filters in Functions?

The IScoreFunction interface allow only ExponentialDecayFunction, GaussDateDecayFunction, LinearGeoDecayFunction, FieldValueFactorFunction, RandomScoreFunction, WeightFunction, ScriptScoreFunction


Solution

  • Functions is a collection of IScoreFunction. In the example JSON, the first function is a random score function, and the second, a weight function. The linked Query DSL example has examples of the different functions, and here's an example to match the JSON above

    var client = new ElasticClient();
    
    var searchRequest = new SearchRequest<ProductType>
    {
        Query = new FunctionScoreQuery()
        {
            Query = new MatchAllQuery { },
            Boost = 5,
            Functions = new List<IScoreFunction>
            {
                new RandomScoreFunction
                {
                    Filter = new MatchQuery
                    {
                        Field = "test",
                        Query = "bar"
                    },
                    Weight = 23
                },
                new WeightFunction
                {
                    Filter = new MatchQuery
                    {
                        Field = "test",
                        Query = "cat"
                    },
                    Weight = 42
                }
            },
            MaxBoost = 42,
            ScoreMode = FunctionScoreMode.Max,
            BoostMode = FunctionBoostMode.Multiply,
            MinScore = 42
        }
    };
    
    var searchResponse = client.Search<ProductType>(searchRequest);