Indexes: Boosting
-
When querying with some filtering conditions,
a basic score is calculated for each document in the results by the underlying engine. -
Providing a boost value to some fields allows you to prioritize the resulting documents.
The boost value is integrated with the basic score, making the document rank higher.
Automatic ordering of the results by the score is configurable. -
Boosting can be achieved in the following ways:
-
At query time:
Apply a boost factor to searched terms at query time - see article Boost search results. -
Via index definition:
Apply a boost factor in your index definition - as described in this article.
-
-
In this page:
Assign a boost factor to an index-field
Applying a boost value to an index-field allows you to prioritize matching documents based on an index-field.
The index:
class Orders_ByCountries_BoostByField extends AbstractCsharpIndexCreationTask {
constructor() {
super();
this.map = `from order in docs.Orders
let company = LoadDocument(order.Company, "Companies")
select new {
// Boost index-field 'ShipToCountry':
// * Use method 'Boost', pass a numeric value to boost by
// * Documents that match the query criteria for this field will rank higher
ShipToCountry = order.ShipTo.Country.Boost(10),
CompanyCountry = company.Address.Country
}`;
}
}
The query:
const orders = await session
.query({ indexName: "Orders/ByCountries/BoostByField" })
.whereEquals("ShipToCountry", "Poland")
.orElse()
.whereEquals("CompanyCountry", "Portugal")
.all();
// Because index-field 'ShipToCountry' was boosted (inside the index definition),
// then documents containing 'Poland' in their 'ShipTo.Country' field will get a higher score than
// documents containing a company that is located in 'Portugal'.
from index "Orders/ByCountries/BoostByField"
where ShipToCountry == "poland" or CompanyCountry == "portugal"
Assign a boost factor to the index-entry
Applying a boost value to the whole index-entry allows you to prioritize matching documents by content from the document.
The index:
class Orders_ByCountries_BoostByIndexEntry extends AbstractCsharpIndexCreationTask {
constructor() {
super();
this.map = `from order in docs.Orders
let company = LoadDocument(order.Company, "Companies")
select new {
ShipToCountry = order.ShipTo.Country,
CompanyCountry = company.Address.Country
}
// Boost the whole index-entry:
// * Use method 'Boost'
// * Pass a document-field that will set the boost level dynamically per document indexed.
// * The boost level will vary from one document to another based on the value of this field.
.Boost(order.Freight)`;
}
}
The query:
const orders = await session
.query({ indexName: "Orders/ByCountries/BoostByIndexEntry" })
.whereEquals("ShipToCountry", "Poland")
.orElse()
.whereEquals("CompanyCountry", "Portugal")
.all();
// The resulting score per matching document is affected by the value of the document-field 'Freight'.
// Documents with a higher 'Freight' value will rank higher.
from index "Orders/ByCountries/BoostByIndexEntry"
where ShipToCountry == "poland" or CompanyCountry == "portugal"
Automatic score-based ordering
-
By default, whenever boosting is involved, either via a dynamic query or when querying an index that has a boosting factor in its definition, the results will be automatically ordered by the score.
-
This behavior can be modified using the OrderByScoreAutomaticallyWhenBoostingIsInvolved
configuration key. -
Refer to section Get resulting score to learn how to retrieve the calculated score of each result.
Corax vs Lucene: boosting differences
-
Boosting features available:
-
When using Corax as the underlying indexing engine, you can only assign a boost factor to the index-entry.
Applying a boost factor to an index-field is Not supported. -
When using Lucene, you can assign a boost factor to both the index-field and the whole index-entry.
-
-
Algorithm used:
Corax ranks search results using the BM25 algorithm.
Other search engines, e.g. Lucene, may use a different ranking algorithm and return different search results.