Lucene: how to boost some specific field
If you get here after 2020, in Lucene 8.5.2.
- Document.setBoost() doesn't exist anymore.
- Field.setBoost() doesn't exist anymore.
- Query.setBoost() doesn't exist anymore.
The ways to go:
Wrap your Query (any Query but probably TermQuery in this case) in à BoostQuery
Query boosted = new BoostQuery(query, 2f);
Use the caret ^ symbol in your query parser syntax.
- Specify boosts in MultiFiledQueryParser.
- Use PerFieldSimilarityWrapper and adjust score per field.
You can boost in 3 ways. Depending on your needs you might want to employ a combination
Document level boosting - while indexing - by calling document.setBoost() before a document is added to the index.
Document's Field level boosting - while indexing - by calling field.setBoost() before adding a field to the document (and before adding the document to the index).
Query level boosting - during search, by setting a boost on a query clause, calling Query.setBoost().
source: http://lucene.apache.org/core/old_versioned_docs/versions/3_0_0/scoring.html
Here is how you can do that:
Query titleQuery, viewsQuery;
titleQuery.setBoost(0.8);
viewsQuery.setBoost(0.2);
BooleanQuery query = new BooleanQuery();
query.add(titleQuery, Occur.MUST); // or Occur.SHOULD if this clause is optional
query.add(viewsQuery, Occur.SHOULD); // or Occur.MUST if this clause is required
// use query to search documents
The score will be proportional to 0.8*score(titleQuery) + 0.2*score(viewsQuery)
(to a multiplicative constant).
To leverage your views
field, you will probably need to use a ValueSourceQuery.