Lucene常用的字段类型lucene检索打分原理
在 Apache Lucene 中,Field
类是文档中存储数据的基础。不同类型的 Field
用于存储不同类型的数据(如文本、数字、二进制数据等)。以下是一些常用的 Field
类型及其底层存储结构:
-
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));
-
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));
-
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)); // 如果需要存储原始值
-
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."));
-
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)));
-
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)。这个分数反映了文档与查询的相关性,分数越高,表示文档越相关。打分用于确定搜索结果的排序,即哪些文档应该排在前面展示给用户。
打分的基本概念
-
相关性分数:
- 每个文档在搜索结果中都会有一个相关性分数,数值越高,表示文档越符合查询条件。
- 相关性分数是一个浮点数,通常在 0 到 1 之间,但也可以大于 1。
-
TF-IDF 模型:
- Lucene 使用 TF-IDF(Term Frequency-Inverse Document Frequency)模型来计算相关性分数。
- TF(词频):在一个文档中某个词的出现频率。词频越高,表示该词对文档的重要性越大。
- IDF(逆文档频率):某个词在所有文档中出现的频率。文档频率越低,表示该词对区分文档的重要性越大。
-
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)是一个动态计算的过程,相关性分数并不是预先存储在索引中的,而是根据查询和文档在搜索时实时计算的。因此,打分的值是临时的,不会永久存储在索引中。
-
动态计算:
- 当你执行一个查询时,Lucene 会根据查询条件和文档内容,动态计算每个匹配文档的相关性分数。
- 这个计算过程基于查询的类型、词频(TF)、逆文档频率(IDF)、文档长度等因素。
-
不存储在索引中:
- 相关性分数并不会被存储在索引中。存储在索引中的信息包括倒排索引、词项频率、文档值等。
- 每次执行查询时,Lucene 都会重新计算相关性分数,这确保了分数总是根据最新的查询条件和文档内容而更新。
相关文章:
Lucene常用的字段类型lucene检索打分原理
在 Apache Lucene 中,Field 类是文档中存储数据的基础。不同类型的 Field 用于存储不同类型的数据(如文本、数字、二进制数据等)。以下是一些常用的 Field 类型及其底层存储结构: TextField: 用途:用于存储…...

适用于IntelliJ IDEA 2024.1.2部署Tomcat的完整方法,以及笔者踩的坑,避免高血压,保姆级教程
Tips:创建部署Tomcat直接跳转到四 一、软件准备 笔者用的是IntelliJ IDEA 2024.1.2和Tomcat 8.5。之前我使用的是Tomcat 10,但遇到了许多问题。其中一个主要问题是需要使用高于1.8版本的JDK,为此我下载了新的JDK版本,但这又引发了更多的兼容…...

XSS靶场通关详解
前言 这里作者采用phpstudy部署的xss-lab靶场,配置如下: 第一关 进入靶场后寻找页面的传参处,发现url中的name参数传了test给页面,可以在此处进行尝试xss 成功弹窗! payload: <script>alert(1)<…...

Excel 技巧15 - 在Excel中抠图头像,换背景色(★★)
本文讲了如何在Excel中抠图头像,换背景色。 1,如何在Excel中抠图头像,换背景色 大家都知道在PS中可以很容易抠图头像,换背景色,其实Excel中也可以抠简单的图,换背景色。 ※所用头像图片为百度搜索&#x…...
备忘-humanplus相关的代码解析
-1: numpy必须为1.20.0,否则会报错,版本冲突0.rlvalue-based: 如q-learning(走迷宫),对当前状态下作出的动作进行价值计算,通过贪婪策略穷尽所有可能选择最佳state-action,但是对于连续的动作空间&#x…...

青少年编程与数学 02-008 Pyhon语言编程基础 01课题、语言概要
青少年编程与数学 02-008 Pyhon语言编程基础 01课题、语言概要 一、榜一大哥起源与早期发展版本演进与社区壮大应用领域的拓展编程语言排行榜的常客结语 二、当前排行三、出色表现四、易学易用五、特色显著六、资源丰富初学者资源中高级学习资源在线编程学习平台 课题摘要:本文…...
XSS (XSS)分类
XSS (XSS) 概要 XSS全称为Cross Site Scripting,为了和CSS分开简写为XSS,中文名为跨站脚本。该漏洞发生在用户端,是指在渲染过程中发生了不在预期过程中的JavaScript代码执行。XSS通常被用于获取Cookie、以受攻击者的…...
[Linux]el8安全配置faillock:登录失败达阈值自动锁定账户配置
前言 本篇文章的配置仅使用于el8版本的Linux,目前已在centos8、BCLinux8上验证成功,其他版本系统是否可行还得考查。 el8中管理用户登录失败锁定账户所用的模块是faillock.so,如果想要将配置应用与其他版本的Linux,建议确认Linux…...

最新-CentOS 7安装1 Panel Linux 服务器运维管理面板
CentOS 7安装1 Panel Linux 服务器运维管理面板 一、前言二、环境要求三、在线安装四、离线安装1.点击下面1 Panel官网链接访问下载,如未登录或注册,请登录/注册后下载2.使用将离线安装包上传至目标终端/tem目录下3.进入到/tem目录下解压离线安装包4.执行…...
selenium定位网页元素
1、概述 在使用 Selenium 进行自动化测试时,定位网页元素是核心功能之一。Selenium 提供了多种定位方法,每种方法都有其适用场景和特点。以下是通过 id、linkText、partialLinkText、name、tagName、xpath、className 和 cssSelector 定位元素的…...
積分方程與簡單的泛函分析8.具連續對稱核的非齊次第II類弗雷德霍姆積分算子方程
1)def求解具連續對稱核的非齊次第II類弗雷德霍姆積分算子方程 设 是定义在上的连续对称核函数, 非齐次第二类弗雷德霍姆积分算子方程的形式为: , 其中是未知函数,是给定的连续函数,是参数。 2)def其特徵值是否一致…...
长理算法复习
选择排序 #include<iostream>using namespace std;const int N 1010; int a[N]; int n;void selectSort(){for (int i 0; i < n;i){int pos i;for (int j i 1; j < n;j){if(a[j]<a[pos])pos j;}swap(a[i], a[pos]);} }int main() {cin >> n;for (i…...

机器学习-K近邻算法
文章目录 一. 数据集介绍Iris plants dataset 二. 代码三. k值的选择 一. 数据集介绍 鸢尾花数据集 鸢尾花Iris Dataset数据集是机器学习领域经典数据集,鸢尾花数据集包含了150条鸢尾花信息,每50条取自三个鸢尾花中之一:Versicolour、Setosa…...

使用rsync+inotify简单实现文件实时双机双向同步
使用rsyncinotify简单实现文件实时双机双向同步 实现思路 使用inotify-tools的inotifywait工具监控文件变化,触发后使用rsync做同步。加入系统服务项,实现实时监听,方便管理。 以下配置操作,单向同步,只需在单边部…...
Ubuntu 24.04 LTS开机自启动脚本设置方法
目录 Ubuntu中设置开机自启动脚本步骤1:修改 rc-local.service文件步骤2:创建/etc/rc.local文件步骤3:修改/etc/rc.local的权限步骤4:启动rc-local.service步骤5:查看rc-local.service的服务状态 Ubuntu中设置开机自启…...
谈谈对JavaScript 中的事件冒泡(Event Bubbling)和事件捕获(Event Capturing)的理解
JavaScript 中的事件冒泡(Event Bubbling)和事件捕获(Event Capturing),是浏览器在处理事件时采用的两种机制,它们在事件的传播顺序上有显著区别。这两种机制帮助开发者在事件触发时,能够以不同…...

解读2025年生物医药创新技术:展览会与论坛的重要性
2025生物医药创新技术与应用发展展览会暨论坛,由天津市生物医药行业协会、BIO CHINA生物发酵展组委会携手主办,山东信世会展服务有限公司承办,定于2025年3月3日至5日在济南黄河国际会展中心盛大开幕。展会规模60000平方米、800参展商、35场会…...
【第七天】零基础入门刷题Python-算法篇-数据结构与算法的介绍-一种常见的分治算法(持续更新)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Python数据结构与算法的详细介绍1.Python中的常用的分治算法2. 分治算法3.详细的分治代码1)一种常见的分治算法 总结 前言 提示:这…...

Spring Data JPA 实战:构建高性能数据访问层
1 简介 1.1 Spring Data JPA 概述 1.1.1 什么是 Spring Data JPA? Spring Data JPA 是 Spring Data 项目的一部分,旨在简化对基于 JPA 的数据库访问操作。它通过提供一致的编程模型和接口,使得开发者可以更轻松地与关系型数据库进行交互,同时减少了样板代码的编写。Spri…...
Python JSON:深入解析与高效应用
Python JSON:深入解析与高效应用 引言 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。Python 作为一种广泛使用的编程语言,对 JSON 的支持非常友好。本文将深入探讨 Python 中 JSON 的处理方法,包括基本操…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...

Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...