Lucene:如何提升某些特定领域

时间:2012-03-22 19:27:20

标签: lucene search-engine

在我的例子中,文档有两个字段,例如“title”和“views”。 “views”表示人们访问此文档的次数。喜欢:“标题”:“iphone”,“views”:“10”。 我必须制定一个策略,为视图分配一些权重,例如相关性得分由得分(标题)* 0.8 +得分(观点)* 0.2计算。 lucene可以做到这一点吗?我想知道是否有一些与此问题相关的算法。

3 个答案:

答案 0 :(得分:10)

以下是如何做到这一点:

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

分数将与0.8*score(titleQuery) + 0.2*score(viewsQuery)成比例(乘以常数)。

要利用您的views字段,您可能需要使用ValueSourceQuery

答案 1 :(得分:6)

你可以通过3种方式进行提升。根据您的需要,您可能希望使用组合

  

文档级别提升 - 在索引时 - 通过调用   将文档添加到索引之前的document.setBoost()。

     

文档的字段级别提升 - 在索引时 - 通过调用   field.setBoost()在向文档添加字段之前(以及之前)   将文档添加到索引中)。

     

查询级别提升 - 期间   搜索,通过设置查询子句的提升,调用   Query.setBoost()。

来源:http://lucene.apache.org/core/old_versioned_docs/versions/3_0_0/scoring.html

答案 2 :(得分:4)

如果您是2020年以后到达这里的人,请使用Lucene 8.5.2。

  1. Document.setBoost()不再存在。
  2. Field.setBoost()不再存在。
  3. Query.setBoost()不再存在。

前进的方式:

  1. 在àBoostQuery中包装您的查询(任何查询,但在这种情况下可能是TermQuery)

    Query boosted = new BoostQuery(query, 2f);
    
  2. 在查询解析器语法中使用插入符号^。

  3. 指定MultiFiledQueryParser中的增强功能。
  4. 使用PerFieldSimilarityWrapper并调整每个字段的得分。