如何用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...

面试题 相关文章推荐
简述synchronized和java.util.concurrent.locks.Lock的异同
Dec 08 面试题
威盛公司软件C++工程师笔试题面试题
Jul 16 面试题
NULL是什么,它是怎么定义的
May 09 面试题
傲盾软件面试题
Aug 17 面试题
什么是属性访问器
Oct 26 面试题
如何进行Linux分区优化
Feb 12 面试题
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
Apr 11 面试题
一些Unix笔试题和面试题
Sep 25 面试题
软件工程师面试题
Jun 25 面试题
不同浏览器创建XMLHttpRequest方法有什么不同
Nov 17 面试题
Java中的基本数据类型所占存储空间大小固定的吗
Feb 15 面试题
正隆泰信息技术有限公司上机题
Jun 14 面试题
名词解释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无法访问远程mysql的问题分析及解决
2013/05/16 PHP
PHP实现事件机制实例分析
2015/06/26 PHP
PHP自定义多进制的方法
2016/11/03 PHP
全面解析PHP面向对象的三大特征
2017/06/10 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
PHP htmlspecialchars_decode()函数用法讲解
2019/03/01 PHP
Javascript 跨域访问解决方案
2009/02/14 Javascript
EXTJS内使用ACTIVEX控件引起崩溃问题的解决方法
2010/03/31 Javascript
jquery向.ashx文件post中文乱码问题的解决方法
2011/03/28 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
2013/10/24 Javascript
css+js实现部分区域高亮可编辑遮罩层
2014/03/04 Javascript
使用jQuery获取data-的自定义属性
2015/11/10 Javascript
javascript日期验证之输入日期大于等于当前日期
2015/12/13 Javascript
微信小程序 基础知识css样式media标签
2017/02/15 Javascript
自定义事件解决重复请求BUG的问题
2017/07/11 Javascript
利用node.js+mongodb如何搭建一个简单登录注册的功能详解
2017/07/30 Javascript
JS实现的视频弹幕效果示例
2018/08/17 Javascript
微信小程序image图片加载完成监听
2019/08/31 Javascript
ant-design-vue 快速避坑指南(推荐)
2020/01/21 Javascript
修改vue源码实现动态路由缓存的方法
2020/01/21 Javascript
Vue动态加载图片在跨域时无法显示的问题及解决方法
2020/03/10 Javascript
Python入门篇之函数
2014/10/20 Python
Centos5.x下升级python到python2.7版本教程
2015/02/14 Python
独特的python循环语句
2016/11/20 Python
详解Python之unittest单元测试代码
2018/01/24 Python
解决pyttsx3无法封装的问题
2018/12/24 Python
python 字典 setdefault()和get()方法比较详解
2019/08/07 Python
Python中的引用和拷贝实例解析
2019/11/14 Python
英国最大的纸工艺品商店:CraftStash
2018/12/01 全球购物
北美最大的零售退货翻新商:VIP Outlet
2019/11/21 全球购物
巴西最大的运动品牌:Olympikus
2020/07/14 全球购物
J2EE面试题集锦(附答案)
2013/08/16 面试题
公关关系专员的自我评价分享
2013/11/20 职场文书
个人委托书范本汇总
2014/10/01 职场文书
单位租车协议书
2015/01/29 职场文书
优化经济发展环境工作总结
2015/08/11 职场文书