lucene索引建立的效率研究

Lucene初试——关于大文本建立索引和中文乱码以及QueryParser检索的一些体会 这几天因为一个小项目用到Lucene,于是去学习了一下,现在还有很多地方没有了解,先就我遇到的问题做下总结。 一、大文本建索引问题 我这里说的大文本,实际上也就200M左右的txt,或许不应该成为大文本,但是我在建索引时遇到200M左右的的确导致了内存溢出,报错误java.lang.OutOfMemoryError: Java heap space ,到网上查了很久,试了一些方法,比如修改JV 阅读详情

Boosting特性

luncene对Document和Field提供了一个可以设置的Boosting参数, 这个参数的用处是告诉lucene, 某些记录更重要,在搜索的时候优先考虑他们 比如在搜索的时候你可能觉得几个门户的网页要比垃圾小站更优先考

 

lucene默认的boosting参数是1.0,  如果你觉得这个field重要,你可以把boosting设置为1.5, 1.2….等, 对Document设置boosting相当设定了它的每个Field的基准boosting,到时候实际Field的boosting就是(Document-boosting*Field-boosting)设置了一遍相同的boosting.

似乎在lucene的记分公式里面有boosting参数,不过我估计一般人是不会去研究他的公式的(复杂),而且公式也无法给出最佳值,所以我们所能做的只能是一点一点的改变boosting, 然后在实际检测中观察它对搜索结果起到多大的作用来调整

一般的情况下是没有必要使用boosting的, 因为搞不好你就把搜索给搞乱了, 另外如果是单独对Field来做Bossting, 也可以通过将这个Field提前来起到近似的效果

Indexing Date

日期是lucene需要特殊考虑的地方之一, 因为我们可能需要对日期进行范围搜索, Field.keyword(string,Date)提供了这样的方法,lucene会把这个日期转换为string, 值得注意的是这里的日期是精确到毫秒的,可能会有不必要的性能损失, 所以我们也可以把日期自行转化为YYYYMMDD这样的形势,就不用精确到具体时间了,通过File.keyword(Stirng,String) 来index, 使用PrefixQuery 的YYYY一样能起到简化版的日期范围搜索(小技巧), lucene提到他不能处理1970年以前的时间,似乎是上一代电脑系统遗留下来的毛病

 

Indexing 数字

 

 

  1. 如果数字只是简单的数据, 比如中国有56个民族. 那么可以简单的把它当字符处理
  2. 如果数字还包含数值的意义,比如价格, 我们会有范围搜索的需要(20元到30元之间的商品),那么我们必须做点小技巧, 比如把3,34,100 这三个数字转化为003,034,100 ,因为这样处理以后, 按照字符排序和按照数值排序是一样的,而lucene内部按照字符排序,003->034->100 NOT(100->3->34)

 

排序

Lucene默认按照相关度(score)排序,为了能支持其他的排序方式,比如日期,我们在add Field的时候,必须保证field被Index且不能被tokenized(分词),并且排序的只能是数字,日期,字符三种类型之一

 

Lucene的IndexWriter调整

IndexWriter提供了一些参数可供设置,列表如下

 属性默认值说明
mergeFactororg.apache.lucene.mergeFactor10控制index的大小和频率,两个作用
maxMergeDocsorg.apache.lucene.maxMergeDocsInteger.MAX_VALUE限制一个段中的document数目
minMergeDocsorg.apache.lucene.minMergeDocs10缓存在内存中的document数目,超过他以后会写入到磁盘
maxFieldLength 1000一个Field中最大Term数目,超过部分忽略,不会index到field中,所以自然也就搜索不到

这些参数的的详细说明比较复杂:mergeFactor有双重作

  1. 设置每mergeFactor个document写入一个段,比如每10个document写入一个段
  2. 设置每mergeFacotr个小段合并到一个大段,比如10个document的时候合并为1小段,以后有10个小段以后合并到一个大段,有10个大段以后再合并,实际的document数目会是mergeFactor的指数

简单的来说mergeFactor 越大,系统会用更多的内存,更少磁盘处理,如果要打批量的作index,那么把mergeFactor设置大没错, mergeFactor 小了以后, index数目也会增多,searhing的效率会降低, 但是mergeFactor增大一点一点,内存消耗会增大很多(指数关系),所以要留意不要”out of memory”
把maxMergeDocs设置小,可以强制让达到一定数量的document写为一个段,这样可以抵消部分mergeFactor的作用.
minMergeDocs相当于设置一个小的cache,第一个这个数目的document会留在内存里面,不写入磁盘。这些参数同样是没有最佳值的, 必须根据实际情况一点点调整。
maxFieldLength可以在任何时刻设置, 设置后,接下来的index的Field会按照新的length截取,之前已经index的部分不会改变。可以设置为Integer.MAX_VALUE

RAMDirectory 和 FSDirectory 转化

RAMDirectory(RAMD)在效率上比FSDirectyr(FSD)高不少, 所以我们可以手动的把RAMD当作FSD的buffer,这样就不用去很费劲的调优FSD那么多参数了,完全可以先用RAM跑好了index, 周期性(或者是别的什么算法)来回写道FSD中。 RAMD完全可以做FSD的buffer。

 

为查询优化索引(index)

Indexwriter.optimize()方法可以为查询优化索引(index),之前提到的参数调优是为indexing过程本身优化,而这里是为查询优化,优化主要是减少index文件数,这样让查询的时候少打开文件,优化过程中,lucene会拷贝旧的index再合并,合并完成以后删除旧的index,所以在此期间,磁盘占用增加, IO符合也会增加,在优化完成瞬间,磁盘占用会是优化前的2倍,在optimize过程中可以同时作search。

 

并发操作Lucene和locking机制

 

 

  • 所有只读操作都可以并发
  • 在index被修改期间,所有只读操作都可以并发
  • 对index修改操作不能并发,一个index只能被一个线程占
  • index的优化,合并,添加都是修改操作

IndexWriter和IndexReader的实例可以被多线程共享,他们内部是实现了同步,所以外面使用不需要同步
 

Locing

   lucence内部使用文件来locking, 默认的locking文件放在java.io.tmpdir,可以通过-Dorg.apache.lucene.lockDir=xxx指定新的dir,有write.lock commit.lock两个文件,lock文件用来防止并行操作index,如果并行操作, lucene会抛出异常,可以通过设置-DdisableLuceneLocks=true来禁止locking,这样做一般来说很危险,除非你有操作系统或者物理级别的只读保证,比如把index文件刻盘到CDROM上。

 

调试IndexWriter

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

相关推荐

参数估计Picard迭代在非线性常微分方程参数估计中的应用研究(Matlab代码实现)

内容概要:本文系统研究了Picard迭代法在非线性常微分方程参数估计中的应用,深入阐述了该方法的数学原理及其在参数辨识中的收敛性与稳定性优势。通过构建最小化误差的目标函数,并结合数值积分技术,采用迭代方式逐步逼近系统的真实参数值,有效解决了非线性动态系统中因缺乏解析解而难以进行精确建模的问题。文中提供了完整的Matlab代码实现,涵盖模型定义、迭代求解、参数更新与结果可视化等关键环节,增强了方法的可操作性与工程实用性。研究通过典型非线性系统案例验证了算法的有效性,展示了其在科学计算与工程建模中的良好适应性与推广潜力。; 适合人群:具备常微分方程理论、数值分析基础及Matlab编程能力,从事系统建模、参数辨识、动力学仿真等相关方向的研究生、科研人员和工程技术开发者。; 使用场景及目标:①解决实际工程中非线性微分方程模型的未知参数估计问题;②深入理解Picard迭代法在科学计算中的实现机制与数值特性;③为学术论文复现、科研项目开发或课程设计提供可运行、易调试的技术方案与代码参考。; 阅读建议:建议读者结合文中的数学推导与Matlab代码逐行分析,重点关注迭代流程、目标函数构造与数值积分的耦合实现,通过修改模型结构或噪声条件进行扩展实验,以深化对算法鲁棒性与适用边界的理解。配套资源可通过指定公众号和网盘链接获取,推荐同步学习以加速科研进程。

Lucene索引存储的优化

一、索引优化技巧 1.索引的合并 writer.addindexes(new Directory()[]{}); 将索引对象添加进去 思路: 使用RAMDirectory,提高索引效率。 RAMDirectory ramdir= new RAMDirectory(); IndexWriter ramWriter= new IndexWriter(ramdir,iwc); D

分享,卓越 1789

XYF.SHX

XYF.SHX

Lucene中创建索引效率和删除索引的实现

越来越多的人利用开源组件 Lucene来开发自己的搜索引擎。在数据量不大的情况下,我们不会太关注创建索引效率;但是,但数据达到一定的数量是,我们就不得不考虑如何提高创建索引的性能,以缩短索引创建的时间。 我们是用Lucene中提供的类IndexWriter来创建索引的,所以我们不妨先看一看IndexWriter类中关系到索引创建效率的几个方法。 一、SetMergeFactor(合并因子)Set...

litxuf的专栏 223

[Lucene那点事儿]建立索引的一点想法

<br />Lucene建立索引的时候,需要使用到分词器-Analyzer,分词器的作用就是将当前的文本按照分词规则进行分词,然后建立索引,检索结果的精确度很大程度上来自于索引建立是否合理而准确。<br />lucene提供了一些内置的分词器:  * SimpleAnalyzer  这个分词是一段一段话进行分 * StandardAnalyzer 标准分词拿来分中文和ChineseAnalyzer一样的效果   * PerFieldAnalyzerWrapper  这个很有意思,可以封装很多分词方式,还可

quzishen的专栏 3725

Lucene 建立索引效率 (仍然推荐在内存中建立索引再写回)

提高索引性能 利用 Lucene,在创建索引的工程中你可以充分利用机器的硬件资源来提高索引效率。当你需要索引大量的文件时,你会注意到索引过程的瓶颈是在往磁盘上写索引文件的过程中 。 为了解决这个问题, Lucene 在内存中持有一块缓冲区。但我们如何控制 Lucene 的缓冲区呢?幸运的是,Lucene 的类 IndexWriter 提供了三个参数用来调整缓冲区的大小以及往磁...

piziwang 221

[lucene]使用lucene建立网站搜索服务

<br />lucene是一个全文检索引擎(非分布式),使用java编写并且可以很方便的嵌入到各种系统中以实现全文检索功能,其通过对字符串进行分词,然后针对分词结果分别建立索引,存入内存或者磁盘,以提供搜索服务,这个功能用起来就像是一个单机版的google,模糊匹配的结果会被展示给用户。应用lucene较为出名的就包括了eclipse的帮助系统。<br />很多时候搜索这个概念会含糊不清,通常意义上对于一个网站的搜索功能是针对于从数据库中捞取数据并通过freemarker或者velocity渲染模板后展示出

quzishen的专栏 5018

Lucene索引数据库

  1.写一段传统的JDBC程序,将每条的用户信息从数据库读取出来2.针对每条用户记录,建立一个lucene document Document doc = new Document();并根据你的需要,将用户信息的各个字段对应luncene document中的field 进行添加,如: doc.add(new Field("NAME","USERNAME",Field.Store.YES,

小人物的专栏 1万+

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

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

清晨 6261

3、学习lucene索引的更新和优化

上一篇里简单介绍了lucene索引的删除等操作,本篇将简单介绍索引的更新和优化。其实,在lucene中并没有像数据库中的更新似的操作,lucene索引更新其实是先把对应的索引删除,然后加入新的索引;至于索引优化问题,我记得在3.0之前的时候用的是IndexWriter的optimize()方法,但到了3.0之后本方法就过时了,提供了新的优化方法。 一、索引的更新 啥也不说了,直接上代码。

代码空间,程序家园 3139

[LangChain RAG] 05 LCEL 链与 Memory:从竖线组链到多轮对话

除了固定功能的解析器,也可以自己编写 Lambda 完成自定义逻辑。把普通函数转换为 Runnable 实例,方便自定义函数加入 chain。RunnableLambda(函数对象或 lambda 匿名函数)"我邻居姓:{lastname},刚生了{gender},请起名,仅告知我名字,不要额外信息""姓名{name},请帮我解析含义。res: str = chain.invoke({"lastname": "张", "gender": "女儿"})print(res)

· 304

焊接变位机_1.rar

焊接变位机_1.rar

基于多尺度集成极限学习机回归(Matlab代码实现)

内容概要:本文详细介绍了一种基于多尺度集成极限学习机(Extreme Learning Machine, ELM)的回归方法,并提供了完整的Matlab代码实现。该方法通过构建多尺度特征表示与集成学习机制,有效提升了ELM在处理非线性、高维复杂数据时的预测精度与模型鲁棒性,特别适用于时间序列回归任务。文档不仅阐述了算法的核心原理与技术流程,还系统展示了其在风电功率预测等工程场景中的应用潜力。同时,文中附带了丰富的科研仿真案例集合,涵盖智能优化算法、深度学习、信号处理、电力系统调度等多个前沿方向,体现了多学科交叉融合的技术优势与实践价值。; 适合人群:具备一定Matlab编程能力,从事科学研究或工程应用的研究生、科研人员及工程技术开发者,尤其适合专注于机器学习、智能算法优化、新能源预测与电力系统建模等相关领域的专业人员。; 使用场景及目标:①用于风电、光伏、负荷等时间序列数据的高精度回归预测任务;②为科研工作者提供可复现的多尺度集成ELM模型代码框架,支持快速算法验证与二次开发;③满足实际工程项目中对高效建模、实时预测与智能决策的技术需求。; 阅读建议:建议读者结合所提供的Matlab代码进行动手实践,深入理解多尺度特征构造与集成策略的设计思想,同时可参考文档中其他相关算法案例进行横向比较与综合应用,以提升整体科研创新能力。

精密钟表配件叉片插针组装机 -原创设计.rar

精密钟表配件叉片插针组装机 -原创设计.rar

精密制造基于桥式三坐标的深孔同轴度测量:半导体流体控制阀PTFE阀体形位公差定量检测方案

内容概要:本文针对高精密制造中深孔内部特征难以精确定量测量的技术瓶颈,提出了一套基于中图仪器Mars Classic 10128桥式三坐标测量机的解决方案,重点解决长径比大于5:1的PTFE四氟阀体深孔同轴度与圆柱度测量难题。通过采用自主研发的深孔加长测针组件与CP500S扫描测头,克服了传统接触式测针刚性不足和光学设备视场遮挡的问题,实现了对深孔内部形貌的连续扫描与三维拓扑建模,输出精度可达≤0.025mm,建立了可追溯、可量化的测量标准流程。; 适合人群:从事半导体流体控制阀、高精密PTFE阀体等零部件设计、制造与质量检测的工程技术人员及测试管理人员,具备一定几何公差与三坐标测量基础知识的专业人员; 使用场景及目标:①解决“影像仪测不到深孔内部”或“深孔长径比大于5怎么测”的实际工程问题;②实现对深孔同轴度、圆柱度等形位公差的定量评价,替代传统通止规定性判断;③为工艺优化、刀具补偿和质量追溯提供精准数据支持; 阅读建议:此资源作为技术应用指南,兼具设备选型参考与测量方法指导价值,建议结合实际检测案例对照操作,并联系中图仪器技术中心获取实测验证支持。

上一篇: 不同规则的中文分词对Lucene索引的影响
下一篇: Linux I/O重定向的一些小技巧
dbigbear
博客等级 码龄24年 54粉丝 149原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值