Function Score Query Usage

edit

Fluent DSL example

edit
q
.FunctionScore(c => c
    .Name("named_query")
    .Boost(1.1)
    .Query(qq => qq.MatchAll())
    .BoostMode(FunctionBoostMode.Multiply)
    .ScoreMode(FunctionScoreMode.Sum)
    .MaxBoost(20.0)
    .MinScore(1.0)
    .Functions(f => f
        .Exponential(b => b
            .Field(p => p.NumberOfCommits)
            .Decay(0.5)
            .Origin(1.0)
            .Scale(0.1)
            .Weight(2.1)
            .Filter(fi => fi
                .Range(r => r
                    .Field(p => p.NumberOfContributors)
                    .GreaterThan(10)
                )
            )
        )
        .GaussDate(b => b.Field(p => p.LastActivity).Origin(DateMath.Now).Decay(0.5).Scale("1d"))
        .LinearGeoLocation(b => b
            .Field(p => p.LocationPoint)
            .Origin(new GeoLocation(70, -70))
            .Scale(Distance.Miles(1))
            .MultiValueMode(MultiValueMode.Average)
        )
        .FieldValueFactor(b => b
            .Field(p => p.NumberOfContributors)
            .Factor(1.1)
            .Missing(0.1)
            .Modifier(FieldValueFactorModifier.Square)
            .Weight(3)
            .Filter(fi => fi
                .Term(t => t
                    .Field(p => p.Branches)
                    .Value("dev")
                )
            )
        )
        .RandomScore(r => r.Seed(1337).Field("_seq_no"))
        .RandomScore(r => r.Seed("randomstring").Field("_seq_no"))
        .Weight(1.0)
        .ScriptScore(s => s
            .Script(ss => ss
                .Source("Math.log(2 + doc['numberOfCommits'].value)")
            )
            .Weight(2)
        )
    )
)

Object Initializer syntax example

edit
new FunctionScoreQuery()
{
    Name = "named_query",
    Boost = 1.1,
    Query = new MatchAllQuery(),
    BoostMode = FunctionBoostMode.Multiply,
    ScoreMode = FunctionScoreMode.Sum,
    MaxBoost = 20.0,
    MinScore = 1.0,
    Functions = new List<IScoreFunction>
    {
        new ExponentialDecayFunction
        {
            Origin = 1.0,
            Decay = 0.5,
            Field = Field<Project>(p => p.NumberOfCommits),
            Scale = 0.1,
            Weight = 2.1,
            Filter = new NumericRangeQuery
            {
                Field = Field<Project>(f => f.NumberOfContributors),
                GreaterThan = 10
            }
        },
        new GaussDateDecayFunction
            { Origin = DateMath.Now, Field = Field<Project>(p => p.LastActivity), Decay = 0.5, Scale = TimeSpan.FromDays(1) },
        new LinearGeoDecayFunction
        {
            Origin = new GeoLocation(70, -70), Field = Field<Project>(p => p.LocationPoint), Scale = Distance.Miles(1),
            MultiValueMode = MultiValueMode.Average
        },
        new FieldValueFactorFunction
        {
            Field = Field<Project>(p => p.NumberOfContributors),
            Factor = 1.1,
            Missing = 0.1,
            Modifier = FieldValueFactorModifier.Square,
            Weight = 3,
            Filter = new TermQuery
            {
                Field = Field<Project>(p => p.Branches),
                Value = "dev"
            }
        },
        new RandomScoreFunction { Seed = 1337, Field = "_seq_no" },
        new RandomScoreFunction { Seed = "randomstring", Field = "_seq_no" },
        new WeightFunction { Weight = 1.0 },
        new ScriptScoreFunction { Script = new InlineScript("Math.log(2 + doc['numberOfCommits'].value)"), Weight = 2.0 }
    }
}

Example json output.

{
  "function_score": {
    "_name": "named_query",
    "boost": 1.1,
    "boost_mode": "multiply",
    "functions": [
      {
        "exp": {
          "numberOfCommits": {
            "origin": 1.0,
            "scale": 0.1,
            "decay": 0.5
          }
        },
        "weight": 2.1,
        "filter": {
          "range": {
            "numberOfContributors": {
              "gt": 10.0
            }
          }
        }
      },
      {
        "gauss": {
          "lastActivity": {
            "origin": "now",
            "scale": "1d",
            "decay": 0.5
          }
        }
      },
      {
        "linear": {
          "locationPoint": {
            "origin": {
              "lat": 70.0,
              "lon": -70.0
            },
            "scale": "1mi"
          },
          "multi_value_mode": "avg"
        }
      },
      {
        "filter": {
          "term": {
            "branches": {
              "value": "dev"
            }
          }
        },
        "field_value_factor": {
          "field": "numberOfContributors",
          "factor": 1.1,
          "missing": 0.1,
          "modifier": "square"
        },
        "weight": 3.0
      },
      {
        "random_score": {
          "seed": 1337,
          "field": "_seq_no"
        }
      },
      {
        "random_score": {
          "seed": "randomstring",
          "field": "_seq_no"
        }
      },
      {
        "weight": 1.0
      },
      {
        "script_score": {
          "script": {
            "source": "Math.log(2 + doc['numberOfCommits'].value)"
          }
        },
        "weight": 2.0
      }
    ],
    "max_boost": 20.0,
    "min_score": 1.0,
    "query": {
      "match_all": {}
    },
    "score_mode": "sum"
  }
}