`
hufuli
  • 浏览: 9004 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Lucene的score打分策略的问题

 
阅读更多
    这段时间在项目中我们在使用lucene的时候发现一个问题,例如:
    有两个索引域的内容为:新浪微博spring、新浪微博,当我输入"新浪微博"进行搜索的时候,按照lucene的score计算公式,新浪微博的值应该要高,但是实际上两个值却是一样。通过分析源代码发现问题出现的原因是:
    lucene在计算lengNorm的时候本身没有错,但是它对lengNorm进行了编码,结果转码的时候会出现错误,比如计算出来的lengNorm为0.4472136,可是经过它内部的编码解码后值却变成了:0.4375,导致计算出来的score值出现误差,代码为NormsWriterPerField类中:
        if (fieldInfo.isIndexed && !fieldInfo.omitNorms) {
      if (docIDs.length <= upto) {
        assert docIDs.length == upto;
        docIDs = ArrayUtil.grow(docIDs, 1+upto);
        norms = ArrayUtil.grow(norms, 1+upto);
      }
      final float norm = docState.similarity.computeNorm(fieldInfo.name, fieldState);
      norms[upto] = Similarity.encodeNorm(norm);
      docIDs[upto] = docState.docID;
      upto++;
    }

编码解码代码为Similarity类中:
  /** Cache of decoded bytes. */
  private static final float[] NORM_TABLE = new float[256];

  static {
    for (int i = 0; i < 256; i++)
      NORM_TABLE[i] = SmallFloat.byte315ToFloat((byte)i);
  }
  /** Decodes a normalization factor stored in an index.
   * @see #encodeNorm(float)
   */
  public static float decodeNorm(byte b) {
    return NORM_TABLE[b & 0xFF];  // & 0xFF maps negative bytes to positive above 127
  }
  public static byte encodeNorm(float f) {
    return SmallFloat.floatToByte315(f);
  }


我想lucene的作者不会犯这种低级错误吧,应该是故意这样设计的吧,至于原因,目前还在分析中。。。。。
**********************************分界线×××××××××××××××××××××××
原因是因为作者将编码后的lengthNorm值转化成一个byte,而一个float是四个字节,导致了数据的准确性。作者这样设计估计是为了在保证不影响正常功能的情况下尽可能的提高性能吧。
分享到:
评论

相关推荐

    lucene-搜索过程源码解析-Score树

    标题与描述均聚焦于“Lucene搜索过程源码解析—Score树”,这表明文章将深入探讨Lucene这一流行的信息检索库在实现搜索功能时的核心机制之一:Score树。Lucene是一个开源的全文检索引擎工具包,它提供了创建索引、...

    lucene示例 demo+jar包

    4. **高级特性(Advanced Features)**: 可能包括模糊搜索、短语搜索、近似搜索、多字段搜索、评分策略等。 **使用 Lucene 的 jar 包** "lucene示例 demo+jar包"中提到的 jar 包是 Lucene 库的运行时依赖,它们...

    基于lucene的开发JavaEE项目

    同时,我们还可以使用评分函数(ScoreFunction)和自定义比较器(Comparator)实现复杂的排序逻辑。 5. **高亮显示**:在搜索结果中,通常需要突出显示匹配的关键词。Lucene的Highlighter组件可以自动完成这个任务...

    lucene全文检索案例源码

    - 使用自定义ScoreFunction:根据业务需求,自定义评分函数,使搜索结果更符合用户期望。 - 利用Filter和QueryWrapperFilter:过滤无关文档,提升搜索效率。 五、总结 通过对“lucene全文检索案例源码”的学习,...

    lucene-3.02

    2. **缓存策略**:利用Lucene的缓存机制,如TermVectorCache和DocumentCache,提升查询速度。 3. **倒排索引优化**:通过调整段合并策略和位图索引,进一步提升搜索效率。 4. **实时索引**:结合NRT(Near Real ...

    luceneDemo(完整代码)

    除此之外,还可以通过自定义ScoreFunction或使用BM25等更复杂的评分模型来调整排序规则。 在"luceneDemo4.0"中,你将会看到以上概念的具体应用,包括创建索引、执行查询、高亮展示结果以及调整排序逻辑的示例代码。...

    lucene 5.4.1 官方文档离线版

    - **Scoring**: Lucene的评分机制,基于TF-IDF等算法评估文档的相关性。 3. **高级特性**: - **MultiFieldQueryParser**:允许在一个Document的多个Field中进行搜索。 - **Filter**和**QueryWrapperFilter**...

    lucene源码

    - **了解 `Similarity`**:熟悉评分机制,以及如何定制自己的评分策略。 **4. 扩展与优化** - **分布式搜索**:学习 `Solr` 或 `Elasticsearch`,它们基于 Lucene 提供了更高级别的服务,支持分布式索引和搜索。 ...

    lucene做的桌面搜索

    这些文档的评分(Score)由Term Frequency-Inverse Document Frequency (TF-IDF) 算法计算得出,高分文档通常与查询更为相关。 除了基本的搜索功能,该程序还可能实现了其他辅助功能,如文件类型的过滤、搜索结果的...

    lucene.jar

    7. 文档评分(Score):Lucene根据查询的相关性对结果进行评分。 二、功能特性 1. 全文检索:支持对文本的精确匹配、模糊匹配、短语查询等多种检索方式。 2. 高效性能:通过倒排索引实现快速的查询响应。 3. 空间...

    lucene-6.6.3.zip

    例如,可以通过自定义 Analyzer 实现更精确的中文分词策略,通过 Filter 进行结果过滤,通过 Collector 实现定制化的结果收集。 **6. 在大规模数据开发中的应用** 在大数据环境中,Lucene 可以与 Hadoop、Spark 等...

    lucene API文档

    Lucene允许根据文档的评分(score)或者自定义字段进行排序。评分是基于查询与文档的相关性计算得出的,可以通过Similarity类进行调整。此外,还可以使用FieldDoc排序,依据文档中的某个字段值进行排序。 五、其他...

    lucene高级搜索进阶项目_03

    我们可能需要定制ScoreFunction或者使用CustomScoreQuery来自定义评分规则,以满足特定业务需求。同时,我们还需要了解如何利用FieldCache进行基于字段的排序。 除此之外,项目中可能包含对Lucene的性能优化。这...

    全文检索Lucene 全文检索Lucene

    - **Score**:Lucene会根据相关性对结果进行评分,高分代表更相关。 - ** Hits**:查询结果集,包括匹配的文档及其分数。 - **Hit**:单个匹配的文档,包括文档ID、分数和其他相关信息。 4. **Compass检索框架**...

    Lucene Demo组件

    Lucene 支持基于评分(Score)、文档ID或自定义字段的排序。使用 `Sort` 类定义排序规则,并在执行查询时传递给 `IndexSearcher`。 5. **性能优化** - **批量索引**:一次处理大量文档比逐个添加更高效。 - **...

    Lucene5学习之自定义排序

    首先,Lucene的核心功能之一就是提供高效的全文检索能力,但默认的搜索结果排序通常是基于相关度得分(Relevance Score),这是由TF-IDF算法计算得出的。然而,在实际应用中,我们往往需要根据其他因素(如时间、...

    lucene+api搜索引擎引工具源码

    它可以根据评分(Relevance Score)对结果进行排序,提供更相关的搜索结果。 7. **Hit 和 HitCollector**: 搜索结果通常以 `Hit` 对象的形式返回,包含文档的相关信息。`HitCollector` 接口允许开发者自定义收集和...

    lucene in action 源码

    默认是TF-IDF,但可以通过自定义ScoreFunction实现不同的评分策略。 9. **MemoryIndex**: 用于在内存中构建和搜索小型索引,适用于测试和原型设计。 通过阅读和分析这些源码,不仅可以深入理解Lucene的工作机制,...

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--data

    - Lucene支持多种排序策略,如按照评分评分(Score排序),按照文档ID排序,或者根据自定义字段排序。 - 在查询时,通过设置Sort对象指定排序依据和顺序。 5. 高亮显示: - Lucene提供Highlighter类来高亮搜索结果...

    lucene高级搜索进阶项目_02

    通过实现自己的ScoreFunction,可以调整匹配文档的相关性评分。此外,还可以通过SortField自定义排序规则,比如按照日期、地理位置或其他元数据进行排序。 四、多字段搜索 在一个文档中,数据通常分散在多个字段中...

Global site tag (gtag.js) - Google Analytics