【问题标题】:Lucene: how to boost some specific fieldLucene:如何提升某些特定领域
【发布时间】:2012-04-07 10:05:29
【问题描述】:

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

【问题讨论】:

    标签: lucene search-engine


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • document.setBoost() 很久以前就被弃用了。
    【解决方案2】:

    您可以这样做:

    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

    【讨论】:

    【解决方案3】:

    如果你在 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 并调整每个字段的分数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 2021-06-25
      相关资源
      最近更新 更多