倒排索引--lucene

Lucene 倒排索引原理 1 前言 Lucene 作为 Apache 开源的一款搜索工具,一直以来是实现搜索功能的神兵利器,现今火热的 Solr 和 Elasticsearch 均基于该工具包进行开发,我们搜索召回组这边也是基于 Lucene 实现了一套索引构建机制,用于酒店搜索、门票搜索、大搜等搜索相关业务。 而 Lucene 之所以能在搜索中发挥至关重要的作用正是因为倒排索引。 因此,本文将介绍一下倒排索引的概念以及倒排索引在 Lucene 中的实现。 2 基本原理 2.1 什么是倒排索引 搜索的核心需求是全文检索,全文检索简单 阅读详情

用途

   倒排文件 (倒排索引),索引对象是文档或者 文档集合 中的单词等,用来存储这些单词在一个文档或者一组文档中的存储位置,是对文档或者文档集合的一种最常用的索引机制。

编辑本段原理

  Lucene倒排索引原理
  Lucene是一个高性能的java全文检索工具包,它使用的是 倒排文件 索引结构。该结构及相应的生成算法如下:
  0)设有两篇文章1和2
  文章1的内容为:Tom lives in Guangzhou,I live in Guangzhou too.
  文章2的内容为:He once lived in Shanghai.

取得关键词

  1)由于lucene是基于关键词索引和查询的,首先我们要取得这两篇文章的关键词,通常我们需要如下处理措施
  a.我们现在有的是文章内容,即一个字符串,我们先要找出字符串中的所有单词,即分词。英文单词由于用空格分隔,比较好处理。中文单词间是连在一起的需要特殊的分词处理。
  b.文章中的”in”, “once” “too”等词没有什么实际意义,中文中的“的”“是”等字通常也无具体含义,这些不代表概念的词可以过滤掉
  c.用户通常希望查“He”时能把含“he”,“HE”的文章也找出来,所以所有单词需要统一大小写。
  d.用户通常希望查“live”时能把含“lives”,“lived”的文章也找出来,所以需要把“lives”,“lived”还原成“live”
  e.文章中的标点符号通常不表示某种概念,也可以过滤掉
  在lucene中以上措施由Analyzer类完成
  经过上面处理后
  文章1的所有关键词为:[tom] [live] [guangzhou] [i] [live] [guangzhou]
  文章2的所有关键词为:[he] [live] [shanghai]

建立倒排索引

  2) 有了关键词后,我们就可以建立倒排索引了。上面的对应关系是:“文章号”对“文章中所有关键词”。倒排索引把这个关系倒过来,变成:“关键词”对“拥有该关键词的所有文章号”。文章1,2经过倒排后变成
  关键词 文章号
  guangzhou 1
  he 2
  i 1
  live 1,2
  shanghai 2
  tom 1
  通常仅知道关键词在哪些文章中出现还不够,我们还需要知道关键词在文章中出现次数和出现的位置,通常有两种位置:a)字符位置,即记录该词是文章中第几个字符(优点是关键词亮显时定位快);b)关键词位置,即记录该词是文章中第几个关键词(优点是节约索引空间、词组(phase)查询快),lucene中记录的就是这种位置。
  加上“出现频率”和“出现位置”信息后,我们的索引结构变为:
  关键词 文章号[出现频率] 出现位置
  guangzhou 1[2] 3,6
  he 2[1] 1
  i 1[1] 4
  live 1[2] 2,5, 2[1],2
  shanghai 2[1] 3
  tom 1[1] 1
  以live 这行为例我们说明一下该结构:live在文章1中出现了2次,文章2中出现了一次,它的出现位置为“2,5,2”这表示什么呢?我们需要结合文章号和出现频率来分析,文章1中出现了2次,那么“2,5”就表示live在文章1中出现的两个位置,文章2中出现了一次,剩下的“2”就表示live是文章2中第 2个关键字。
  以上就是lucene索引结构中最核心的部分。我们注意到关键字是按字符顺序排列的(lucene没有使用B树结构),因此lucene可以用二元 搜索算法 快速定位关键词。

编辑本段实现

  实现时 lucene将上面三列分别作为词典文件(Term Dictionary)、频率文件(frequencies)、位置文件 (positions)保存。其中词典文件不仅保存有每个关键词,还保留了指向频率文件和位置文件的 指针 ,通过指针可以找到该关键字的频率信息和位置信息。
  Lucene中使用了field的概念,用于表达信息所在位置(如标题中,文章中,url中),在建索引中,该field信息也记录在词典文件中,每个关键词都有一个field信息(因为每个关键字一定属于一个或多个field)。

编辑本段压缩算法

  为了减小 索引文件 的大小,Lucene对索引还使用了 压缩技术 。首先,对词典文件中的关键词进行了压缩,关键词压缩为<前缀长度,后缀>,例如:当前词为“ 阿拉伯 语”,上一个词为“阿拉伯”,那么“阿拉伯语”压缩为<3,语>。其次大量用到的是对数字的压缩,数字只保存与上一个值的差值(这样可以减小数字的长度,进而减少保存该数字需要的字节数)。例如当前文章号是16389(不压缩要用3个字节保存),上一文章号是16382,压缩后保存7(只用一个字节)。

编辑本段应用原因

  下面我们可以通过对该索引的查询来解释一下为什么要建立索引。
  假设要查询单词 “live”,lucene先对词典二元查找、找到该词,通过指向频率文件的指针读出所有文章号,然后返回结果。词典通常非常小,因而,整个过程的时间是毫秒级的。

  而用普通的顺序匹配算法,不建索引,而是对所有文章的内容进行字符串匹配,这个过程将会相当缓慢,当文章数目很大时,时间往往是无法忍受的。


原帖:http://baike.baidu.com/view/676861.htm

Lucene倒排索引简述 细说倒排索引构建 设计合适的数据结构对影响提升至关,在特定的场景使用的合适的结构是成功的基石,Lucene采用哪些数据结构解决构建索引的性能呢?本文将带你领略Lucene数据结构之美。 阅读详情

相关推荐

Lucene 倒排索引原理详解:深入探讨相关算法设计

在传统的索引结构中,索引项通常是直接指向文档的,也就是说,它是按照“文档 -> 词”的方式来组织的。但在全文搜索中,我们需要的是一种能够快速定位包含特定关键词的所有文档的方法。这就引入了倒排索引的概念。倒排索引(Inverted Index)是一种特殊的索引数据结构,它将文档中出现的关键词映射到包含这些关键词的所有文档的列表上。换句话说,它是一个从“词 -> 文档”的映射关系。这种结构特别适合用于全文检索,因为它能够快速地找到包含指定关键词的所有文档。

weixin_43841461的博客 1659

Lucene是一个基于Java的全文信息检索工具包,它提供了强大的索引和搜索功能

Lucene提供了丰富的API,可以用于创建和管理索引,执行复杂的查询操作,并支持各种搜索功能,如模糊搜索、范围搜索、布尔搜索等。除了Java版本的Lucene,还有其他语言的实现版本,如Python的PyLucene和.NET的Lucene.NET等。Lucene是一个基于Java的全文信息检索工具包,它提供了强大的索引和搜索功能,可以用于构建各种类型的搜索应用程序。它使用倒排索引的方式来存储和检索文档,通过将文档中的每个词语与其所在的文档进行关联,实现了高效的搜索和排序。

[Blog][Domain] programb.blog.youkuaiyun.com 1347

Lucene倒排索引简述 之索引表

Lucene倒排索引的核心内容,索引表,你对这部分真的熟悉了吗?那你知道FST用什么地方吗?FST又存储了什么内容呢?有什么功能呢?关于Burst-Trie,你知道Lucene是如何采用它的思想来加速Lucene搜索性能的吗?

Lucene/Solr解密 4831

ELK基础介绍

ELK是什么? ELK是E(Elasticsearch),L(LogStash),K(Kibana)的缩写,可以理解为一套分布式快速检索与展示的解决方案套装。按照what-why-how的三段论技术讲解方法论,本文主要是What阶段的介绍。 Elasticsearch 的工作原理是什么? 原始数据会从多个来源(包括日志、系统指标和网络应用程序)输入到 Elasticsearch 中。数据采集指在 Elasticsearch 中进行索引之前解析、标准化并充实这些原始数据的过程。这些数据在 Elast

michaelgo的博客 890

【5G】5G 核心网(5GC)基本架构

本文旨在科普5G核心网相关知识...

Learning makes me happy (0^◇^0) 4万+

别再被骚扰了!手把手教你彻底卸载阿里云盾(安骑士)并封禁其IP段

本文详细指导如何彻底卸载阿里云盾(安骑士)并封禁其IP段,帮助用户夺回服务器控制权。从识别监控组件到执行官方卸载脚本,再到手动清理残留文件和配置iptables规则,确保完全阻断云盾通信。适用于追求极致性能或需要完全自主控制的环境。

weixin_42525551的博客 450

什么是倒排索引?

为什么需要倒排索引 倒排索引,也是索引。 索引,初衷都是为了快速检索到你要的数据。 每种数据库都有自己要解决的问题(或者说擅长的领域),对应的就有自己的数据结构,而不同的使用场景和数据结构,需要用不同的索引,才能起到最大化加快查询的目的。 对 Mysql 来说,是 B+ 树,对 Elasticsearch/Lucene 来说,是倒排索引。 Elasticsearch 是建立在全文搜索引擎库 Lucene 基础上的搜索引擎,它隐藏了 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTf

u013008898的博客 2万+

SAP MM新手避坑指南:工厂间调拨用301还是303?手把手教你选对移动类型

本文深入解析SAP MM模块中工厂间调拨的301与303移动类型,帮助新手避开常见陷阱。通过对比一步法(301)和两步法(303+305)的核心差异、适用场景及财务影响,提供清晰的决策框架和实战技巧,确保库存调拨的准确性和效率。

weixin_29223603的博客 346

倒排索引原理

下图是一个相对复杂些的倒排索引,与上图的基本索引系统比,在单词对应的倒排列表中不仅记录了文档编号,还记载了单词频率信息(TF),即这个单词在某个文档中的出现次数,之所以要记录这个信息,是因为词频信息在搜索结果排序时,计算查询和文档相似度是很重要的一个计算因子,所以将其记录在倒排列表中,以方便后续排序时进行分值计算。这样每个文档就转换为由单词序列构成的数据流,为了系统后续处理方便,需要对每个不同的单词赋予唯一的单词编号,同时记录下哪些文档包含这个单词,在如此处理结束后,我们可以得到最简单的倒排索引。

meser88的博客 1万+

【ROS】ROS局域网下多机通讯方法

最近工作中需要用到多机通讯,这里稍微总结一下使用方法。一、网络配置ifconfig这里举个例子,主机的IP地址为192.168.1.127,从机的IP地址为192.168.1.126;之后可测试一下能否互相ping通,成功后进行下一步。

weixin_43326110的博客 3360

ROS2实战:手把手教你用walking机器人仿真实现医院多楼层自动配送(含实时地图切换)

本文详细介绍了如何利用ROS2和walking机器人仿真平台实现医院多楼层自动配送系统,重点讲解了动态地图切换技术和多楼层导航的实现方法。通过实时加载地图和优化电梯过渡策略,解决了医院复杂环境下的自主配送难题,为医疗物流自动化提供了实用解决方案。

weixin_29090917的博客 360

Lucene倒排索引

索引 - 幕布 索引正向索引(forward idnex)倒排索引基本概念 文档(Document):一般搜索引擎的处理对象是互联网网页,而文档这个概念要更宽泛些,代表以文本形式存在的存储对象,相比网页来说,涵盖更多种形式,比如Word,PDF,html,XML等不同格式的文件都可以称之为文档。再比如一封邮件,一条短信,一条微博也可以称之为文档。在本书后续内容,很多情况...

风一般的男子·小亮仔 583

基于 SpringAI 整合 DeepSeek 模型实现 AI 聊天对话

很多云平台都提供了一键部署大模型的功能,这里不再赘述(阿里云百炼平台、火山方舟-火山引擎等)Ollama。

📜一个热爱探索的人 1277

全文搜索Lucene——之倒排索引

全文搜索Lucene——之倒排索引 关系数据库不适合做全文搜索:     like '%xxx%'效率很慢,建的索引将无效,查询的时候会像翻书一样一页一页的翻     返回的结果没有匹配度的概念,比如可能希望搜索的关键词在文章中出现的次数越多越是我想要的文章     当搜索live的时候,也想把LIVE/lives/living搜出来,但是数据库很难做到 一、简介     倒排

清晨 6264

【虚幻引擎UE】UE5 仅需6步轻松实现关卡顺滑切换

【虚幻引擎UE】UE5 仅需6步轻松实现关卡切换

灵境引路人 2万+

AHB—SRAMC项目(结构图,核心代码、Testbench架构)

文章目录一、AHB_SRAMC项目介绍1.1.AHB总线控制单元(ahb_slv_if.v)1.2.SRAM控制单元(sramc_top.v)1.3.主要的传输路径二、结构框图2.1.AHB_SRAMC结构图(重点)2.2.总线控制单元与SRAM控制单元结构图三、部分核心代码(重点理解)四、SystemVerilog Testbench架构(重点)五、目录结构 一、AHB_SRAMC项目介绍 本项...

Mr.翟的博客 3万+

Lucene倒排索引简述 番外篇

Lucene构建索引是一个非常复杂的过程,需要经过多道工序才能完成。那你知道Lucene在索引构建过程有哪些工序吗?又是整体流程是怎么样的呢?

Lucene/Solr解密 1969

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Lucene Inverted index(倒排索引)原来快速入门

Lucene是一个高性能的JAVA全文检索工具包,它使用的是倒排文件索引结构。该结构及相应的生成算法如下: 设有两篇文章1和2:文章1的内容为:Tom lives in Guangzhou, I live in Guangzhou too.文章2的内容为:He once lived in Shanghai.  由于lucene是基于关键词索引和查询的,首先我

jackyrongvip的专栏 1016

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Lucene倒排索引原理

这篇文章是转的,写的相当不错 Lucene是一个高性能的java全文检索工具包,它使用的是倒排文件索引结构。该结构及相应的生成算法如下:      0)设有两篇文章1和2   文章1的内容为:Tom lives in Guangzhou,I live in Guangzhou too.   文章2的内容为:He once lived in Shanghai.      1)由于lucene是基...

ChinaJweb 482

Lucene倒排索引实现原理探秘(1)

Lucene倒排索引实现原理探秘(1) 前言 在全文检索领域, Lucene可谓是独领风骚数十年。倒排索引构成全文检索的根基,只有深入理解了倒排索引的实现原理,才能算是入门了全文检索领域。本文将对Lucene的倒排索引的实现原理和技术细节进行详细的剖析,这些内容适用于Lucene 5.x至7.x系列版本。文章整体内容组织如下: 倒排索引理论 Lucene倒排索引实现 Lucene索引文件...

taoqick的专栏 1132

lucene倒排索引缓冲池的细节

倒排索引要存哪些信息   提到倒排索引,第一感觉是词到文档列表的映射,实际上,倒排索引需要存储的信息不止词和文档列表。为了使用余弦相似度计算搜索词和文档的相似度,需要计算文档中每个词的TF-IDF值,这样就需要记录词在每个文档中出现的频率以及包含这个词的文档数量,前者需要对应每个文档记录一个值,后者就是倒排表长度。除此以外,为了能够高亮搜索结果,需要记录每个词在文档中的偏移信息(起始位置和长度)

缠中说禅的博客 1629

lucene倒排索引的内存结构

简介 lucene索引格式是个老生常谈的问题,网上也有一些资料,但是由于年代比较古老(大都是基于3.x或者4.x的版本),和现有代码较难对上,这里基于lucene6.6重新讲解下,也帮助自己理解和记忆。 基本概念 这些信息很容易理解,看代码的时候也很清晰。 lucene在进行索引时,为了加速索引进程,会同时多线程同时进行索引,每一个线程在flush后都是一个完整的索引段。 对...

creater_X 2270
上一篇: java速成----一篇博文搞定基础
下一篇: 笔试面试---设计模式&软件测试&软件工程
crazyhacking
博客等级 码龄15年 299粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值