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

面试题 相关文章推荐
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类
Feb 06 面试题
NULL是什么,它是怎么定义的
May 09 面试题
Ref与out有什么不同
Nov 24 面试题
.net C#面试题
Aug 28 面试题
this关键字的含义
Apr 08 面试题
C#面试题问题集
Apr 02 面试题
如何开启linux的ssh服务
Jun 03 面试题
Linux文件操作命令都有哪些
Jul 23 面试题
中科创达面试题
Dec 28 面试题
如何用Python来进行查询和替换一个文本字符串
Jan 02 面试题
什么是servlet
May 08 面试题
如何定义一个可复用的服务
Sep 30 面试题
名词解释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
CentOS7.0下安装PHP5.6.30服务的教程详解
2018/09/29 PHP
Yii框架模拟组件调用注入示例
2019/11/11 PHP
js word表格动态添加代码
2010/06/07 Javascript
理解Javascript_06_理解对象的创建过程
2010/10/15 Javascript
js 函数调用模式小结
2011/12/26 Javascript
JS实现标签页效果(配合css)
2013/04/03 Javascript
基于OO的动画附加插件,可以实现弹跳、渐隐等动画效果 分享
2013/06/24 Javascript
jquery 多行文本框(textarea)高度变化
2013/07/03 Javascript
js 动态加载事件的几种方法总结
2013/12/25 Javascript
JS根据生日算年龄的方法
2015/05/05 Javascript
实现JavaScript的组成----BOM和DOM详解
2016/05/18 Javascript
Bootstrap布局组件教程之Bootstrap下拉菜单
2016/06/12 Javascript
BootStrap 智能表单实战系列(二)BootStrap支持的类型简介
2016/06/13 Javascript
JavaScript的new date等日期函数在safari中遇到的坑
2016/10/24 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
2016/12/18 Javascript
Vue自定义指令拖拽功能示例
2017/02/17 Javascript
js正则相关知识点专题
2018/05/10 Javascript
从零开始实现Vue简单的Toast插件
2018/12/03 Javascript
[02:28]DOTA2亚洲邀请赛 LGD战队巡礼
2015/02/03 DOTA
python命令行参数sys.argv使用示例
2014/01/28 Python
Python中字典和JSON互转操作实例
2015/01/19 Python
在pycharm中设置显示行数的方法
2019/01/16 Python
在Pycharm中对代码进行注释和缩进的方法详解
2019/01/20 Python
对django中foreignkey的简单使用详解
2019/07/28 Python
python异常处理try except过程解析
2020/02/03 Python
python中可以声明变量类型吗
2020/06/18 Python
Farfetch香港官网:汇集全球时尚奢侈品购物平台
2017/11/26 全球购物
美赞臣营养马来西亚旗舰店:Enfagrow马来西亚
2019/07/26 全球购物
编写函数,将一个3*3矩阵转置
2013/10/09 面试题
科技活动周标语
2014/10/08 职场文书
世界文化遗产导游词
2015/02/13 职场文书
培根随笔读书笔记
2015/07/01 职场文书
nginx location优先级的深入讲解
2021/03/31 Servers
MongoDB安装使用并实现Python操作数据库
2021/06/28 MongoDB
Java 数组内置函数toArray详解
2021/06/28 Java/Android
Windows Server 2022 超融合部署(图文教程)
2022/06/25 Servers