Lucene常用的字段类型lucene检索打分原理

在 Apache Lucene 中,Field 类是文档中存储数据的基础。不同类型的 Field 用于存储不同类型的数据(如文本、数字、二进制数据等)。以下是一些常用的 Field 类型及其底层存储结构:

  1. TextField

    • 用途:用于存储文本数据,并对其进行分词和索引。
    • 底层存储结构:文本数据会被分词器(Analyzer)处理,将文本分割成词项(terms)。每个词项会被存储在倒排索引(inverted index)中,映射到包含该词项的文档。
    • 示例
      import org.apache.lucene.document.Document;
      import org.apache.lucene.document.TextField;
      import org.apache.lucene.document.Field.Store;Document doc = new Document();
      doc.add(new TextField("fieldName", "This is a sample text.", Store.YES));

  2. StringField

    • 用途:用于存储不需要分词的字符串数据,如唯一标识符(ID)等。
    • 底层存储结构:字符串数据作为一个整体存储在倒排索引中,不会进行分词。
    • 示例
      import org.apache.lucene.document.Document;
      import org.apache.lucene.document.StringField;
      import org.apache.lucene.document.Field.Store;Document doc = new Document();
      doc.add(new StringField("fieldName", "unique_identifier", Store.YES));

  3. IntPoint、LongPoint、FloatPoint、DoublePoint

    • 用途:用于存储数值数据,并支持范围查询。
    • 底层存储结构:数值数据会被转换成字节数组,并按照分块(block)的方式存储,以支持高效的范围查询。
    • 示例
      import org.apache.lucene.document.Document;
      import org.apache.lucene.document.IntPoint;
      import org.apache.lucene.document.StoredField;Document doc = new Document();
      int value = 123;
      doc.add(new IntPoint("fieldName", value));
      doc.add(new StoredField("fieldName", value)); // 如果需要存储原始值

  4. StoredField

    • 用途:用于存储不需要索引的数据,仅用于检索时返回的字段。
    • 底层存储结构:数据以原始字节的形式存储在存储字段(stored field)中,不会被索引。
    • 示例
      import org.apache.lucene.document.Document;
      import org.apache.lucene.document.StoredField;Document doc = new Document();
      doc.add(new StoredField("fieldName", "This is the stored content."));

  5. BinaryField

    • 用途:用于存储二进制数据。
    • 底层存储结构:二进制数据以原始字节的形式存储在存储字段中,不会被索引。
    • 示例

      import org.apache.lucene.document.Document;
      import org.apache.lucene.document.StoredField;
      import org.apache.lucene.util.BytesRef;Document doc = new Document();
      byte[] byteArray = new byte[] {1, 2, 3, 4, 5};
      doc.add(new StoredField("fieldName", new BytesRef(byteArray)));

  6. SortedDocValuesField 和 NumericDocValuesField

    • 用途:用于存储排序和打分时需要的字段值。
    • 底层存储结构:数据以紧凑的格式存储在文档值(doc values)中,支持高效的排序和打分计算。
    • 示例
      import org.apache.lucene.document.Document;
      import org.apache.lucene.document.SortedDocValuesField;
      import org.apache.lucene.document.NumericDocValuesField;
      import org.apache.lucene.util.BytesRef;Document doc = new Document();
      doc.add(new SortedDocValuesField("fieldName", new BytesRef("sortable value")));
      doc.add(new NumericDocValuesField("numericField", 12345L));
      

lucene检索打分原理

在 Apache Lucene 中,"打分"(Scoring)是指在搜索过程中,根据文档与查询的匹配程度,为每个文档分配一个相关性分数(relevance score)。这个分数反映了文档与查询的相关性,分数越高,表示文档越相关。打分用于确定搜索结果的排序,即哪些文档应该排在前面展示给用户。

打分的基本概念

  1. 相关性分数

    • 每个文档在搜索结果中都会有一个相关性分数,数值越高,表示文档越符合查询条件。
    • 相关性分数是一个浮点数,通常在 0 到 1 之间,但也可以大于 1。
  2. TF-IDF 模型

    • Lucene 使用 TF-IDF(Term Frequency-Inverse Document Frequency)模型来计算相关性分数。
    • TF(词频):在一个文档中某个词的出现频率。词频越高,表示该词对文档的重要性越大。
    • IDF(逆文档频率):某个词在所有文档中出现的频率。文档频率越低,表示该词对区分文档的重要性越大。
  3. BM25 算法

    • BM25 是 Lucene 默认的打分算法,是 TF-IDF 的进化版本,能够更好地处理长查询和长文档。
    • BM25 考虑了词频、逆文档频率、文档长度等因素。

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;public class LuceneScoringExample {public static void main(String[] args) throws Exception {// 创建分析器StandardAnalyzer analyzer = new StandardAnalyzer();// 创建索引Directory index = new RAMDirectory();IndexWriterConfig config = new IndexWriterConfig(analyzer);IndexWriter writer = new IndexWriter(index, config);// 添加文档addDoc(writer, "Lucene in Action", "193398817");addDoc(writer, "Lucene for Dummies", "55320055Z");addDoc(writer, "Managing Gigabytes", "55063554A");addDoc(writer, "The Art of Computer Science", "9900333X");writer.close();// 创建查询String querystr = "Lucene";// 解析查询Query query = new QueryParser("title", analyzer).parse(querystr);// 搜索int hitsPerPage = 10;IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(index));TopDocs docs = searcher.search(query, hitsPerPage);ScoreDoc[] hits = docs.scoreDocs;// 显示结果System.out.println("Found " + hits.length + " hits.");for (int i = 0; i < hits.length; ++i) {int docId = hits[i].doc;Document d = searcher.doc(docId);System.out.println((i + 1) + ". " + d.get("isbn") + "\t" + d.get("title") + "\t" + hits[i].score);}}private static void addDoc(IndexWriter w, String title, String isbn) throws Exception {Document doc = new Document();doc.add(new TextField("title", title, Field.Store.YES));doc.add(new StringField("isbn", isbn, Field.Store.YES));w.addDocument(doc);}
}

 

在 Apache Lucene 中,打分(scoring)是一个动态计算的过程,相关性分数并不是预先存储在索引中的,而是根据查询和文档在搜索时实时计算的。因此,打分的值是临时的,不会永久存储在索引中。

  1. 动态计算

    • 当你执行一个查询时,Lucene 会根据查询条件和文档内容,动态计算每个匹配文档的相关性分数。
    • 这个计算过程基于查询的类型、词频(TF)、逆文档频率(IDF)、文档长度等因素。
  2. 不存储在索引中

    • 相关性分数并不会被存储在索引中。存储在索引中的信息包括倒排索引、词项频率、文档值等。
    • 每次执行查询时,Lucene 都会重新计算相关性分数,这确保了分数总是根据最新的查询条件和文档内容而更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/893716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node.js的解释

1. Node.js 入门教程 1.1 什么是 Node.js&#xff1f; 1.1.1 Node.js 是什么&#xff1f; Node.js 是一个基于 JavaScript 的开源服务器端运行时环境&#xff0c;允许开发者用 JavaScript 编写服务器端代码。与传统的前端 JavaScript 主要运行在浏览器端不同&#xff0c;Nod…

Flutter android debug 编译报错问题。插件编译报错

下面相关内容 都以 Mac 电脑为例子。 一、问题 起因&#xff1a;&#xff08;更新 Android studio 2024.2.2.13、 Flutter SDK 3.27.2&#xff09; 最近 2025年 1 月 左右&#xff0c;我更新了 Android studio 和 Flutter SDK 再运行就会出现下面的问题。当然 下面的提示只是其…

TDengine 做为 FLINK 数据源技术参考手册

Apache Flink 是一款由 Apache 软件基金会支持的开源分布式流批一体化处理框架&#xff0c;可用于流处理、批处理、复杂事件处理、实时数据仓库构建及为机器学习提供实时数据支持等诸多大数据处理场景。与此同时&#xff0c;Flink 拥有丰富的连接器与各类工具&#xff0c;可对接…

扣子平台音频功能:让声音也能“智能”起来

在数字化时代&#xff0c;音频内容的重要性不言而喻。无论是在线课程、有声读物&#xff0c;还是各种多媒体应用&#xff0c;音频都是传递信息、增强体验的关键元素。扣子平台的音频功能&#xff0c;为开发者和内容创作者提供了一个强大而灵活的工具&#xff0c;让音频的使用和…

RubyFPV开源代码之系统简介

RubyFPV开源代码之系统简介 1. 源由2. 工程架构3. 特性介绍&#xff08;软件&#xff09;3.1 特性亮点3.2 数字优势3.3 使用功能 4. DEMO推荐&#xff08;硬件&#xff09;4.1 天空端4.2 地面端4.3 按键硬件Raspberry PiRadxa 3W/E/C 5. 软件设计6. 参考资料 1. 源由 RubyFPV以…

Vue Motion 应用场景详解

Vue Motion是Vue.js的动画库&#xff0c;能为Vue应用添加过渡和动画效果&#xff0c;使界面更具交互性与视觉吸引力。以下从安装、使用方法、关键特性三方面详解&#xff1a; • 安装&#xff1a;可通过npm或yarn安装。在项目目录下&#xff0c;npm安装使用npm install vue - …

上海计算机学会1月月赛(甲组) T1 简单 MST题解

T2-简单 MST题解 题意 设 ω ( x ) \omega(x) ω(x)为 x x x的质因数所构成的集合大小&#xff1b; 给两个正整数 l l l r r r&#xff0c;图上有 r − l 1 r-l1 r−l1个点&#xff0c;为 l , l 1 , l 2 , ⋯ , r − 2 , r − 1 , r l,l1,l2,\cdots,r-2,r-1,r l,l1,l2,…

gtest with ros

ros test 基本是基于gtest. 如何编写测试模块 cmakelists.txt if (CATKIN_ENABLE_TESTING)catkin_add_gtest(test_mongo_roscpp test/test_mongo_ros.cpp)target_link_libraries(test_mongo_roscpp warehouse_ros) endif ()CATKIN_ENABLE_TESTING 是catkin 专门对test 内容的…

2024年中国SaaS行业发展研究报告:现状、挑战与趋势洞察

一、引言 1.1 研究背景与目的 在数字化时代的浪潮下&#xff0c;软件即服务&#xff08;SaaS&#xff09;模式凭借其独特的优势&#xff0c;如较低的前期成本、易于部署和可扩展性&#xff0c;已经成为企业软件应用的重要趋势。近年来&#xff0c;随着云计算、大数据、人工智…

将 OneLake 数据索引到 Elasticsearch - 第二部分

作者&#xff1a;来自 Elastic Gustavo Llermaly 及 Jeffrey Rengifo 本文分为两部分&#xff0c;第二部分介绍如何使用自定义连接器将 OneLake 数据索引并搜索到 Elastic 中。 在本文中&#xff0c;我们将利用第 1 部分中学到的知识来创建 OneLake 自定义 Elasticsearch 连接器…

PMP–一、二、三模–分类–14.敏捷

文章目录 敏捷中的角色职责与3个工件--题干关键词角色职责3个工件 高频考点分析&#xff08;一、过程&#xff1b;二、人员&#xff09;一、过程&#xff1a;1.1 变更管理&#xff1a;1.1.1 瀑布型变更&#xff08;一次交付、尽量限制、确定性需求 &#xff1e;风险储备&#x…

Spring WebFlux

1. 响应式编程基础 1.1. 什么是响应式编程&#xff1f; 响应式编程是一种编程范式&#xff0c;专注于数据流和变化传播。它的核心思想是&#xff1a; 数据流&#xff1a;将数据看作流动的序列&#xff08;Stream&#xff09;&#xff0c;可以是有限的&#xff08;如列表&#…

数仓的数据加工过程-ETL

ETL代表Extract Transform和Load。ETL将所有三个数据库功能组合到一个工具中&#xff0c;以从一个数据库获取数据并将其放入另一个数据库。 提取&#xff1a;提取是从数据库中提取(读取)信息的过程。在此阶段&#xff0c;从多个或不同类型的来源收集数据。 转换&#xff1a;转…

Vue2下篇

插槽&#xff1a; 基本插槽&#xff1a; 普通插槽&#xff1a;父组件向子组件传递静态内容。基本插槽只能有一个slot标签&#xff0c;因为这个是默认的位置&#xff0c;所以只能有一个 <!-- ParentComponent.vue --> <template> <ChildComponent> <p>…

【Go面试】工作经验篇 (持续整合)

这里写目录标题 什么是逃逸分析服务端怎么接受客户端上传的文件说一下对gin框架的理解gin有哪些常用中间件gin怎么用swagger写接口文档nginx一般是用来做什么如果调用方法经常超时怎么办gin中怎么和mysql通信从mysql调数据到redis,如何同步延时双删redis ,mysql都不存在用户请求…

【科研建模】Pycaret自动机器学习框架使用流程及多分类项目实战案例详解

Pycaret自动机器学习框架使用流程及项目实战案例详解 1 Pycaret介绍2 安装及版本需求3 Pycaret自动机器学习框架使用流程3.1 Setup3.2 Compare Models3.3 Analyze Model3.4 Prediction3.5 Save Model4 多分类项目实战案例详解4.1 ✅ Setup4.2 ✅ Compare Models4.3 ✅ Experime…

C#牵手Blazor,解锁跨平台Web应用开发新姿势

一、引言 在当今数字化时代&#xff0c;Web 应用已成为人们生活和工作中不可或缺的一部分 &#xff0c;而开发跨平台的 Web 应用则是满足不同用户需求、扩大应用影响力的关键。C# 作为一种强大的编程语言&#xff0c;拥有丰富的类库和强大的功能&#xff0c;在企业级开发、游戏…

c语言函数(详解)

目录 前言 一、函数的基本概念和作用 二、函数的声明和定义 三、函数参数的传递方式 四、函数的递归 五、函数指针 总结 前言 本文主要讲解了c语言函数方面的内容 函数的定义和调用函数的返回值和参数函数的作用域和生命周期 函数的声明和定义 函数声明和函数定义的区别函数声…

管理方法(15)-- 向华为学习根因分析

1. 什么是根本原因 美国能源部1992年发布的《根本原因分析指南》(DOE-NE-STD-1004-92)中,把根本原因定义为:指一种原因,当这种原因被纠正以后,将会防止此类事故或者类似事故的再次发生。 定义:导致问题发生的源头或关键原因,同时这种原因能被识别和纠正,消除了该原因…

Oracle、PostgreSQL该学哪一个?

从事数据库运维一线工作的老鸟&#xff0c;经常会有人来问我&#xff1a;“Oracle 和 PostgreSQL&#xff0c;我该学哪个&#xff1f;哪个更有职业发展前景&#xff1f;” 今天就来和大家好好唠唠。 先说说 Oracle。它堪称数据库领域的 “老牌贵族”&#xff0c;功能极其强大。…