Lucene初试——关于大文本建立索引和中文乱码以及QueryParser检索的一些体会

ParallelsDesktop 安装 CentOS-6.9-x86_64-minimal 教程 安装参考 tools没做 想安装的可以参考这个 mac 本机环境: 系统:macOS Catalina version 10.15.6 虚拟机软件:parallels Desktop 15 for Mac( Parallels Desktop-15.1.4(47270)) Centos镜像: CentOS-6.9-x86_64-minimal.iso https://mirrors.aliyun.com/centos-vault/6.8/isos/x86_64/ http://vault.centos. 阅读详情

这几天因为一个小项目用到Lucene,于是去学习了一下,现在还有很多地方没有了解,先就我遇到的问题做下总结。

一、大文本建索引问题

我这里说的大文本,实际上也就200M左右的txt,或许不应该成为大文本,但是我在建索引时遇到200M左右的的确导致了内存溢出,报错误java.lang.OutOfMemoryError: Java heap space ,到网上查了很久,试了一些方法,比如修改JVM的运行参数等,都不行。我测试的机器为i5四核,4G内存,实测时可用内存1G多,按说对于200M的文本不应该可以接受吗?但是就是出现了内存溢出的情况。在对Lucene的机制还不了解的情况下,我想到了以下几种解决方案,一个是切割文本,将大文本首先预处理以下,分成小的文本,二是在建立索引时,对于大文本分段建立,比如读到50M往磁盘写一次,三是按行建立索引,比如一次读1w行。其实我觉得这些内在都是一个道理,就是一点点切分文本,只是实现方式稍有区别。

第一种情况我没有测试,觉得太麻烦,还要写个独立程序切割文本。第二种方式,我的代码逻辑是,读到一定大小的数据之后,就建立一个Document对象,然后设置setMaxBufferedDocs(n),我实测是10M的时候存一个Document,然后setMaxBufferedDocs(5),根据Lucene的官方文档,当内存中的缓存到达指定大小(我设置的200M)或者doc数目达到指定大小(也就是这里设置的5)时,就会触发一次往磁盘里写数据的操作。我觉的这样的话,内存里顶多只会有5*10=50M,大不了IO太频繁降低速度而已,至少得能跑。但实际测试过程中,发现跑了很久很久都没有把一个文本(170M)索引建好,按照我的理解,170M也就3、4次写操作不就可以了,但事实是很久没出现结果。于是我放弃了这种想法,没再去细究。

后来我用第三种方式测试了下,可行,而且效率还可以。思路是,每读1W行建立一个doc,我的这个文本比较特殊,2W行大概也就1m,然后设置setMaxBufferedDocs(100),这样反而可以。具体的数值设置可以根据自己环境来看,代码我也就不贴了,就是循环按行读取文本,1w次之后建立一个Document对象。

后来因为业务的需求,我又改成了1行建一个Document,然后setMaxBufferedDocs(2W),实测效率也可以。因为我检索时需要每一行的信息,所以只能按行读取。比如我的一行数据为“1052307934----huajun7089059----73.63.134.205----安徽省滁州市电信ADSL----2011年7月10日----14:28:24”,我搜索“安徽省滁州市”如果搜到了这条记录,那么我需要这一行的所有信息,如果不按每一行一个Document的话,比如我现在10行一个Document,那么噪音数据太多了。不知道Lucene有没有提供只提取我需要的信息的功能?要不然我就得自己写,从10行中找到我要的,那样也没有多大意义。

二、中文乱码问题

中文乱码真是无处不在。如果文件编码、系统编码、运行环境编码都一样应该不会出现乱码问题。如果知道文件的编码,一般

reader = new BufferedReader(new InputStreamReader(
							new FileInputStream(file), “gbk”));
类似这样的设置就可以解决,但是我的比较麻烦,因为源文件有的是gbk有的是utf-8。所以还得动态的去识别当前文件的编码。我查了下,识别文件编码好像不是那么容易,网上给了很多例子都不是很精确或者稳定,还好我找了一个,对于我的txt还是有用的,代码如下,共享下(非原创):
/**
	 * 查询字符编码
	 * @param fileName
	 * @return UTF-8/Unicode/UTF-16BE/GBK
	 * @throws Exception
	 */
	public static String codeStringPlus(String fileName) throws Exception {
		BufferedInputStream bin = null;
		String code = null;

		try {
			bin = new BufferedInputStream(new FileInputStream(fileName));
			int p =
Android Audio基础——系统服务(二) AudioService 继承自 IAudioService.Stub。IAudioService.Stub 类很明显是通过 IAudioService.aidl 自动生成的。AudioService 位于 Binder Native 端。AudioManager 拥有 AudioService 的 Binder Proxy 端,是 AudioService 在客户端的一个代理。几乎所有客户端对 AudioManager 进行的请求,最终都会交由 AudioService 实现。 阅读详情

相关推荐

Lucene 字符编码问题

NULL 博文链接:https://liuxinglanyue.iteye.com/blog/853285

Lucene之超链接传中文乱码

最近学习ssm使用到Lucene来进行全文检索,取代了以前的模糊查询,与使用like来模糊查询Lucene的优势便凸显出来了,个人使用了Lucene之后真的觉得快捷很多,又不用自己写SQL语句,而且还有高亮,摘要等这些功能。优点我就不再说了,使用了之后就会知道。        因为我也是第一次使用,所以其中肯定也遇到了不少错误,其中对于超链接传中文字符的问题我想记录一下,因为这样的错误可能对很多

weixin_37762923的博客 758

基于Lucene中文自然语言搜索引

针对Lucene 中的中文分析器不符合汉语的习惯,实现基于标准中文词库中文分析器。提高了检索查全率、查准率以及检索性能

lucene解析乱码的异常

org.apache.lucene.queryParser.ParseException: Cannot parse ' ': Encountered "<EOF>" at line 1, column 2. Was expecting one of: <NOT> ... "+" ... "-" ... "(" ... "

mujizi的专栏 864

lucene建立索引,搜索,中文分词

Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包。 现在最新的lucene已经更新到6.0版本了。但是这个最新版,需要适配jdk1.80以上的版本。 所以我这里用的5.5.1的版本的,它对jdk没有这么高的要求,比较适应开发。下面分三步简单的将lucene建立索引,搜索,中文分词,介绍给家。 用到的包: 一,建立索引

young_so_nice的博客 5446

Lucene学习之中文查询问题的解决

在构文档库之后,绝多数的查询都是基于中文进行查询。使用前面的例子,进行测试时,会发现这样问题: 使用关键词“微信”进行搜索时,能够搜索到没有“微信”这个词出现,但是有“微”“信”这两个字出现的文档。造成这种错误搜索的原因是,Lucene标准的分析器在分析文档以及查询关键词时,对于英文是基于单词分词的,但是对于中文,是基于汉字进行分词的,所以就造成了上述的查询问题。为了解决这个问题,我们...

iteye_19930的博客 526

java lucene乱码

regain增加paoding中文分词以及server端版本设置 原文来自:http://monner.iteye.com/blog/254804 ———————————————————————- 补充: 用paoding中文分词,先建立词典 vi /etc/profile export PAODING_DIC_HOME=/data/paoding/dic 将paoding的dic目...

skery的博客 226

中文文本生成的索引文件中有乱码

原因可能是中文文本文件的编码格式与项目的编码格式不一致造成的。 比如我的项目中Java文件的编码是utf-8的,而要建立索引的数据源(一批txt文本文件)是gbk编码的,也就是说:用不同的编码方式对文本建立索引。所以出现了乱码。   解决方式是,调整项目的编目即可。   右击项目--》Properties---》Resource Text file encoding:Other:g

1599

JEE中文乱码问题的原理解决方法汇总

     感谢网友们一直以来对jeecms的关注支持,我们在jeecms使用交流群里经常看到网友反映乱码问题,在JEE开发中,乱码确实是一个令人头痛的问题,相信家都遇到过,今天我们就这个问题总结一下,希望能帮助家更好的解决JEE开发中的乱码问题。      我们知道产生乱码的原因是因为不同的编码造成的,这就好比你一个印地安人在说话,假设你完全不懂印第安语,而对方也不懂汉语,那你们所说的

646

lucene+compass中文乱码问题

家谁碰到过,我感觉是个常见问题。有那位解决的!

GODOMONEY的专栏 917

oracle删除乱码索引,解决Oracle11g中的索引名字乱码问题

有一个主键对应的索引变成了乱码。 如下:如果在SQLPLUS查询: SQLgt; select INDEX_NAME,INDEX_TYPE,TABLE_NAME,UNIQUENESS fr有一个主键对应的索引变成了乱码。如下:如果在SQLPLUS查询:SQL> select INDEX_NAME,INDEX_TYPE,TABLE_NAME,UNIQUENESS from user_index...

weixin_29635919的博客 446

ImgHosting

ImgHosting

上一篇: Lucene初识之Analyzer
下一篇: Oracle安装配置流程
sheen1991
博客等级 码龄15年 30粉丝 38原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值