Score modification
This document explains how search results can be scored and ranked, using boost, constant, and function options.
Quick Start
Need to quickly boost some results? Start here:
{
"query": {
"text": {
"query": "championship",
"path": "heroMedia.title",
"score": {
"boost": 2.0
}
}
}
}Choosing the right score modification:
┌─────────────────────────────────────────────────────────┐
│ Do you need time-based relevance (recent = higher)? │
│ │
│ YES → Use `function` with Gaussian decay │
│ NO → Continue below │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ Do you want to multiply the existing relevance score? │
│ │
│ YES → Use `boost` │
│ NO → Continue below │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ Do you want all matches to have the same score? │
│ │
│ YES → Use `constant` │
│ NO → Use `function` for custom logic │
└─────────────────────────────────────────────────────────┘
Performance: boost ≈ constant > function (arithmetic) > function (Gaussian)
Most common patterns:
- Boost important fields:
boost: 2.0-5.0 - Equal priority:
constant: 100 - Recent articles preferred:
functionwithgauss
boost
boostThe boost option multiplies the score of articles that match a query by a specified factor. For example, you can use boost to give higher relevance to certain fields or search terms.
Performance: Boost is the most efficient score modification option.
Typical use cases:
- Boost specific fields (e.g., title matches more important than content matches)
- Increase relevance of certain tags or categories
- Prioritise featured or pinned content
Score ranges: Relevance scores typically range from 1-20, but can be higher for very relevant matches. Common boost values:
1.5-3.0- Moderate boost for slightly more important matches3.0-10.0- Strong boost for very important matches10.0+- Extreme boost for critical matches
Note:
- The
boostvalue must be a positive number. - A
boostvalue of1.0means no change to the score. - Higher
boostvalues increase the score proportionally. - Cannot be combined with
constantorfunctionin the same score object.
Fields
The boost option takes the following fields:
| Field | Type | Description | Required |
|---|---|---|---|
value | float | The boost factor to apply to the score. | Yes |
Example
{
"query": {
"text": {
"path": "heroMedia.title",
"query": "tournament final",
"score": {
"boost": {
"value": 2.0
}
}
}
}
}Alternatively, you can use a shorthand syntax:
{
"query": {
"text": {
"path": "heroMedia.title",
"query": "tournament final",
"score": {
"boost": 2.0
}
}
}
}constant
constantThe constant option replaces the base score of matching articles with a fixed constant value. This is useful when you want all matching articles to have the same score regardless of their text relevance.
Performance: Very efficient, similar to boost.
Typical use cases:
- Equalising scores for specific filters (e.g., all pinned articles get score 100)
- Overriding relevance for exact matches
- Creating consistent scoring for non-text-based matches
Note: Cannot be combined with boost or function in the same score object.
Fields
The constant option takes the following fields:
| Field | Type | Description | Required |
|---|---|---|---|
value | float | The constant score to assign to matches. | Yes |
Example
{
"query": {
"text": {
"path": "heroMedia.title",
"query": "betting",
"score": {
"constant": {
"value": 5.0
}
}
}
}
}Alternatively, you can use a shorthand syntax:
{
"query": {
"text": {
"path": "heroMedia.title",
"query": "betting",
"score": {
"constant": 5.0
}
}
}
}function
functionThe function option provides advanced score manipulation using mathematical expressions. This is more powerful than boost or constant but also more computationally expensive.
Performance: Functions are the most computationally expensive score modification option, especially Gaussian decay. Use when the flexibility is needed.
Typical use cases:
- Time-based relevance decay (recent articles score higher)
- Complex scoring formulae combining multiple factors
- Non-linear score adjustments
Note: Cannot be combined with boost or constant in the same score object.
Expressions
Use the following expressions with the function option to modify the score of articles:
- Arithmetic expressions - Add, multiply, min, or max a series of numbers
- Constant expressions - Apply a fixed numeric value in the function score
- Gaussian decay expressions - Reduce scores by multiplying them at a specified rate
Important: Unless otherwise specified, all expressions replace the original score of matching articles. To modify the original score instead of replacing it, include the original score using {"score": "relevance"} in your expression where appropriate.
Arithmetic
Arithmetic expressions perform basic mathematical operations on numeric values to replace the score of matching articles.
add
addThe add expression sums a list of numeric values.
Example
{
"function": {
"add": [{ "score": "relevance" }, { "constant": 3.0 }]
}
}In this example, the final score is the sum of the original relevance score and a constant value of 3.0.
multiply
multiplyThe multiply expression multiplies a list of numeric values.
Example
{
"function": {
"multiply": [{ "score": "relevance" }, { "constant": 2.0 }]
}
}min
minThe min expression returns the minimum value from a list of numeric values.
Example
{
"function": {
"min": [{ "score": "relevance" }, { "constant": 10.0 }]
}
}In this example, the final score is capped at a maximum of 10.0 (whichever is smaller: the relevance score or 10.0).
max
maxThe max expression returns the maximum value from a list of numeric values.
Example
{
"function": {
"max": [{ "score": "relevance" }, { "constant": 1.0 }]
}
}In this example, the final score is at least 1.0 (whichever is larger: the relevance score or 1.0).
Constant
Constant expressions allow you to replace the score of matching articles with a fixed numeric value.
Example
{
"function": {
"constant": 4.0
}
}Gaussian
Gaussian decay expressions reduce the scores of articles based on their distance from a specified origin point. This is useful for scenarios like time-based relevance, such as prioritising recently published articles.
How it works: Articles closer to the origin maintain higher scores, whilst articles further away see their scores gradually reduced using a bell curve distribution.
Fields
The Gaussian decay expression takes the following fields:
| Field | Type | Description | Required |
|---|---|---|---|
origin | string | The reference point from which to calculate distance. | Yes |
scale | string | The distance from the origin at which the score will be reduced by half. | Yes |
decay | float | The rate at which the score decays. Default is 0.5. A value of 0.5 means at scale distance, the score is multiplied by 0.5 (reduced by 50%). Lower values (e.g., 0.1) create steeper decay. | No |
offset | string | The distance from the origin before decay starts. Default is 0. Articles within this offset from origin maintain full score before decay begins. | No |
path | string | The field to which the decay function is applied (typically a date field). | Yes |
Example interpretation:
origin: "now", scale: "30d", decay: 0.5- Articles 30 days old have 50% of their scoreorigin: "now", scale: "30d", decay: 0.5, offset: "7d"- Articles 0-7 days old maintain full score; at 37 days old they have 50% score
Example
{
"function": {
"gauss": {
"path": "publishDate",
"origin": "now",
"scale": "10d",
"decay": 0.5,
"offset": "5d"
}
}
}Example usage
Boost recent articles
This example applies time-based scoring to all articles (no search query). Articles are sorted by recency with a gradual decay.
{
"score": {
"function": {
"gauss": {
"path": "publishDate",
"origin": "now",
"scale": "30d",
"decay": 0.5
}
}
}
}Note: When no operator is specified in the request, all documents are matched and scored using the function.
Boost recent articles relative to search relevance
To boost recent articles whilst still considering their original relevance score, you can combine the original score with a Gaussian decay function using the multiply expression:
{
"query": {
"text": {
"query": "championship",
"path": "content.text",
"score": {
"function": {
"multiply": [
{ "score": "relevance" },
{
"gauss": {
"path": "publishDate",
"origin": "now",
"scale": "30d",
"decay": 0.5
}
}
]
}
}
}
}
}Boost articles with "breaking" in the title
{
"query": {
"text": {
"query": "breaking",
"path": "heroMedia.title",
"score": {
"boost": 2.0
}
}
}
}Valid Score Modification Combinations
Only one score modification type can be used per score object:
Valid:
boostaloneconstantalonefunctionalone- Multiple score modifications in different clauses of a
compoundquery
Invalid:
boost+constantin the same score objectboost+functionin the same score objectconstant+functionin the same score object
Example of multiple score modifications (valid):
{
"compound": {
"should": [
{
"text": {
"query": "championship",
"path": "heroMedia.title",
"score": {
"boost": 3.0
}
}
},
{
"equal": {
"path": "pinned",
"value": true,
"score": {
"constant": 100
}
}
}
]
}
}Performance Considerations
Score modification performance (fastest to slowest):
- boost - Simple multiplication, minimal overhead
- constant - Direct assignment, minimal overhead
- function (arithmetic) - Add/multiply operations, moderate overhead
- function (Gaussian) - Complex calculations involving date math and decay curves, highest overhead
Recommendations:
- Use
boostfor simple score adjustments when possible - Reserve
functionfor cases where time-based decay or complex formulae are necessary - Consider the trade-off between query performance and scoring sophistication
- For high-traffic endpoints, prefer
boostover Gaussian functions when acceptable
Updated 13 days ago
