Lucene: how to boost some specific field

If you get here after 2020, in Lucene 8.5.2.

  1. Document.setBoost() doesn't exist anymore.
  2. Field.setBoost() doesn't exist anymore.
  3. Query.setBoost() doesn't exist anymore.

The ways to go:

  1. Wrap your Query (any Query but probably TermQuery in this case) in à BoostQuery

    Query boosted = new BoostQuery(query, 2f);
    
  2. Use the caret ^ symbol in your query parser syntax.

  3. Specify boosts in MultiFiledQueryParser.
  4. 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.