Search code examples
lucenesearch-engine

Lucene: how to boost some specific field


In my case, documents have two fields, for example, "title" and "views". "views" is represented the num of times that people have visited this document. like: "title":"iphone", "views":"10". I have to develop a strategy that will assign some weights to views, such as the relevance score is calculated by score(title)*0.8+score(views)*0.2. Does lucene can do this? And I want to know whether there are some algorithms related to this question.


Solution

  • 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.