如何用Lucene索引数据库


Posted in 面试题 onFebruary 23, 2016
Lucene一个常见的用例是在一个或者多个数据库表进行全文检索。 虽然MySql有全文检索的功能,但是如果字段和数据量增加,MySql的性能会减低很快。
映射数据到Lucene
通常情况下最需要解决的问题是怎么把你数据库的数据描述到Lucene里面,最可能的解决方法法就是把你的数据表放到平面的Lucence Document对象里面。
用伪代码表示:
String sql = “select id, firstname, lastname, phone, email from person”;
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
Document doc = new Document();
doc.add(new Field(”id”, rs,getString(”firstname”), Field.Store.YES, Field.Index.UN_TOKENIZED));
doc.add(new Field(”firstname”, rs,getString(”firstname”), Field.Store.YES, Field.Index.TOKENIZED));
// … repeat for each column in result set
writer.addDocument(doc);
}
显示搜索结果
当显示搜索结果给用户时,你有两个选择:
1.因为你的Table已经扁平化到了Lucene里面,所以只需要用Document里面的Field.因为Lucene也非常快,这样会大大减低你的数据库的压力。
2.如果你要显示另外的数据到你的搜索结果页,你只需要在Hits里面收集他们的ID,然后从数据库去数据再根据结果组装搜索结果页。
要搜索的东西
以上列出的方式都是假设把整个结果集放到内存里面,这样在数据集大的话会很容易造成问题,你需要在你的SQL里面做一些分页或者offset
你还需要在你的结果集里面做一个try/catch,这样当添加一个Document出错的时候不会影响整个过程。
通常情况下可以把所有的field放到同一个”Contents” field然后只搜索这一个字段,但是需要保留这些field这样可以按field检索。
如果你需要检索多个table
通常最好能用不同的索引来搜索不同类型的数据,而不是把他们加到同一个index然后根据类型来区分。
原因:
可以更简单的维护操作。如果你只需要对这个表进行一个批处理的update,你只需要重建特定的索引而不是所有的索引。

Tags in this post...

面试题 相关文章推荐
编程实现当输入某产品代码则打印出该产品记录的功能
May 03 面试题
如何在发生故障的节点上重新安装 SQL Server
Mar 14 面试题
Oracle中delete,truncate和drop的区别
May 05 面试题
武汉世纪畅想数字传播有限公司 .NET笔试题
Jun 13 面试题
关于递归的一道.NET面试题
May 12 面试题
如果一个类实现了多个接口但是这些接口有相同的方法名将会怎样
Jun 16 面试题
作为网站管理者应当如何防范XSS
Aug 16 面试题
C#实现对任一张表的数据进行增,删,改,查要求,运用Webservice,体现出三层架构
Jul 11 面试题
施惠特软件测试面试题以及笔试题
May 13 面试题
什么时候用assert
May 08 面试题
史上最全面的Java面试题汇总!
Feb 03 面试题
既然说Ruby中一切都是对象,那么Ruby中类也是对象吗
Jan 26 面试题
名词解释WEB SERVICE,SOAP,UDDI,WSDL,JAXP,JAXM;JSWDL开发包的介绍。
Oct 27 #面试题
JDO的含义
Nov 17 #面试题
如何实现jdbc性能优化
Jul 30 #面试题
开发中都用到了那些设计模式?用在什么场合?
Aug 21 #面试题
Java的接口和C++的虚类的相同和不同处
Mar 27 #面试题
数据库连接池的工作原理
Sep 26 #面试题
说出一些常用的类,包,接口
Sep 22 #面试题
You might like
php单例模式实现方法分析
2015/03/14 PHP
php基于dom实现的图书xml格式数据示例
2017/02/03 PHP
取得一定长度的内容,处理中文
2006/12/20 Javascript
jquery多浏览器捕捉回车事件代码
2010/06/22 Javascript
js使用ajax读博客rss示例
2014/05/06 Javascript
jQuery中:header选择器用法实例
2014/12/29 Javascript
JavaScript检测实例属性, 原型属性
2015/02/04 Javascript
JS实现文件动态顺序载入的方法
2015/03/07 Javascript
jQuery实现强制cookie过期方法汇总
2015/05/22 Javascript
使用AngularJS来实现HTML页面嵌套的方法
2015/06/17 Javascript
AngularJS入门之动画
2016/07/27 Javascript
js实现类bootstrap模态框动画
2017/02/07 Javascript
js图片上传的封装代码
2017/08/01 Javascript
layer弹出层全屏及关闭方法
2018/08/17 Javascript
微信小程序点餐系统开发常见问题汇总
2019/08/06 Javascript
python解析html开发库pyquery使用方法
2014/02/07 Python
Python类方法__init__和__del__构造、析构过程分析
2015/03/06 Python
python requests 测试代理ip是否生效
2018/07/25 Python
基于Python的ModbusTCP客户端实现详解
2019/07/13 Python
Python DataFrame一列拆成多列以及一行拆成多行
2019/08/06 Python
Python基于Socket实现简单聊天室
2020/02/17 Python
Python之变量类型和if判断方式
2020/05/05 Python
python logging模块的使用详解
2020/10/23 Python
Python和Bash结合在一起的方法
2020/11/13 Python
Manjaro、pip、conda更换国内源的方法
2020/11/17 Python
俄罗斯小米家用电器、电子产品和智能家居商店:Poood.ru
2020/04/03 全球购物
公司清洁工岗位职责
2013/12/14 职场文书
安全承诺书格式
2014/05/21 职场文书
医院搬迁方案
2014/06/14 职场文书
个人股份合作协议书
2014/10/24 职场文书
小学师德师风整改措施
2014/10/27 职场文书
2014年财务经理工作总结
2014/12/08 职场文书
大学生村官个人总结
2015/02/15 职场文书
2015年司机年终工作总结
2015/05/14 职场文书
Python趣味挑战之实现简易版音乐播放器
2021/05/28 Python
MySQL学习之基础操作总结
2022/03/19 MySQL