重点推荐省级国家级期刊、北大中文核心、CSSCI、EI、SCI发表,稳妥操作,速度快,包发表。有意向联系客服咨询。
论文代写:十年专业服务品质,全部由期刊编辑、硕士、博士撰写;保证原创、版权归您;保证通过、否则全额退款。
论文发表:与百家优秀期刊合作,代理审核组稿,论文发表涵盖所有专业领域,全部正刊,保证出刊,否则全额退款。
业务合作:因业务发展需要,诚招优秀写手合作,要求硕士以上学历,不限专业,另诚征优秀期刊代理合作,具体详谈。QQ:415835425
使用Solr为大数据库搭建搜索引擎
使用Solr 为大数据库搭建搜索引擎
霍庆,刘培植**
作者简介:霍庆,(1987-),女,硕士,通信与信息系统。
通信联系人:刘培植,(1957-),男,教授, 通信与信息系统. E-mail: liupz@bupt.edu.cn
(北京邮电大学信息与通信工程学院,北京 100876)
5 摘要:如今信息快速发展,数据库信息不断增多,尤其是对于中文信息,传统的数据库搜索
方式(like%%)不仅效率低下,而且搜索速度极慢,此时就需要为数据库搭建外部的中文搜
索引擎。Apache Solr 是基于Lucene 的企业搜索引擎。本文介绍了Solr 的结构和特点,并
使用它搭建大数据量的数据库搜索引擎,并在最后比较了数据库和搜索引擎的搜索时间,证
明了使用Solr 能大大增加搜索效率。
10 关键词:搜索引擎;Solr;数据库
25
0 引言
对于企业数据或者Wed 站点而言,中文内容的搜索是必不可少的功能之一。一般当数
据量比较小的时候,各种信息内容都直接存储在数据库系统中,并且使用数据库提供的检索
和查询功能进行中文内容搜索。但是随着数据量的增大,到百万千万乃至上亿条数据的时候,
30 使用数据库中的like "%keyword%"查询,查询效率会急剧的下降。
由于数据库索引不是为全文索引设计的,因此,使用like "%keyword%"时,数据库索引
是不起作用的,在使用like 查询时,搜索过程又变成类似于一页页翻书的遍历过程了,所以
对于含有模糊查询的数据库服务来说,LIKE 对性能的危害是极大的[1]。 此外,使用like 查
询的结果准确性也非常差,例如使用like "%北京%现代%":就不能匹配词序颠倒的“现代
35 xxx 北京”。如果需要查询为“上市 公司2011”,要去查找2011 年 上市的所有公司,数据
库查询用like 就做不到,而如果用搜索引擎建立了“上市 2011”,就可以查找到。
因此使用数据库直接查询来进行中文检索并不是个好的解决方案。而使用搜索引擎就可
以避免数据库like 查询带来的低效性。而使用Solr 搭建自己的搜索引擎更可以避免使用其
他大型搜索引擎的所遇到的更新慢,数据不准确等问题。
40 本文使用Solr 搭建数据库的搜索引擎,并对搜索结果进行对比,体现了使用搜索引擎
带来的查询高效率。
1 Solr 简介
1.1 Solr 概念
Solr 是一个基于Lucene 的Java 搜索引擎服务器。Solr 提供了层面搜索、命中醒目显示
45 并且支持多种输出格式(包括 XML/XSLT 和 JSON 格式)。它易于安装和配置,而且附
带了一个基于 HTTP 的管理界面。Solr 已经在众多大型的网站中使用,较为成熟和稳定。
Solr 包装并扩展了 Lucene,所以Solr 的基本上沿用了Lucene 的相关术语。更重要的是,
Solr 创建的索引与 Lucene 搜索引擎库完全兼容。通过对 Solr 进行适当的配置,某些情况
下可能需要进行编码,Solr 可以阅读和使用构建到其他 Lucene 应用程序中的索引。此外,
50 很多 Lucene 工具(如Nutch、 Luke)也可以使用 Solr 创建的索引[2]。
Solr 主要特性有:强大的全文检索功能,高亮显示检索结果,动态集群,数据库接口
和电子文档(Word ,PDF 等)的处理。而且Solr 具有高度的可扩展,支持分布搜索和索
引的复制。
1.2 Solr 与Lucene
55 上文提到了Lucene,Lucene 是目前最为流行的基于 Java 开源全文检索工具包。Solr 与
Lucene 并不是竞争对立关系,恰恰相反Solr 依存于Lucene ,因为Solr 底层的核心技术是
使用Apache Lucene 来实现的,简单的说Solr 是Lucene 的服务器化。需要注意的是Solr 并
不是简单的对Lucene 进行封装,它所提供的大部分功能都区别于Lucene 。Solr 和Lucene
的本质区别有以下三点:搜索服务器,企业级和管理。Lucene 本质上是搜索库,不是独立
60 的应用程序,而Solr 是。Lucene 专注于搜索底层的建设,而Solr 专注于企业应用。Lucene
不负责支撑搜索服务所必须的管理,而Solr 负责。所以说,一句话概括Solr: Solr 是Lucene
面向企业搜索应用的扩展[3]。
2 搜索引擎构建
2.1 开发环境
65 操作系统:Windows 7
数据库:Oracle 10
Solr 版本:apache-solr-1.4.0
分词器:mmseg4j-1.6.2
词库:sogou-dic
70 运行容器:Tomcat6
2.2 系统结构
图1 系统架构
Fig. 1 System Architecture
75
图1 显示的是搜索引擎的系统架构图。最底层为Oracle 数据库,为测试大数据量的中
文查询情况,数据库中存储1000 万条记录。
中间为Solr 搜索引擎核心,由于Solr 是通过Servlet 方式实现的,因此需要部署在容器
上,本文选择最流行的搭建中小规模Web 应用的Tomcat。由图中可知,Solr 主要需要配置
80 的为分词器、词库以及对应索引数据的配置文件,这些在下文会详细的进行说明。经过这些
配置,使用DataImportHandler 组件,可以通过HTTP 控制生成需要的索引文件。
最上层为应用层,在这层中,可以灵活的使用搜索引擎的查询结果构建自己的搜索应用,
本文不对查询结果进行处理,仅通过XML 列出。此外Solr 提供了SolrJ 的API,用于索引
进行管理,包括查询以及添加、删除索引,这部分在下文也会详细提到。
85 2.3 数据模型
2.3.1 数据库模型
本数据库为一个用户登记表,其中用户名为中文字段。表结构如下:
表1 数据库表结构
90 Tab. 1 Database Table Structure
列名 数据类型 长度
USERCODE VARCHAR2 10
USERNAME VARCHAR2 30
COMCODE VARCHAR2 8
VALIDSTATUS VARCHAR2 1
CHANGEDATE DATE 7
其中USERCODE 为用户编号,USERNAME 存放用户名,COMCODE 存放公司代码,
VALIDSTATUS 存放目前状态,CHANGEDATE 存放最后修改时间。数据表中共存放1000
万条数据。
95 对于USERNAME,由于是本文主要查询对象,为了符合中文语义以及为了使查询更有
意义,创建时使用姓+名1+名2 的方式。其中姓采用“中国姓氏大全”,名1 和名2 从GB2312
汉字库中随机抽取组合而成。
抽取名字部分关键代码如下,先初始化lastNameMap 再随机抽取:
private static String randomLastName() {
int key = (int) (Math.random() 100 lastNameMap.size());
String n1 = lastNameMap.get(key);
key = (int) (Math.random() lastNameMap.size());
String n2 = lastNameMap.get(key);
return n1 + n2;
105 }
public static void initLastNameMap() throws UnsupportedEncodingException {
int index = 0;
String str = "";
byte[] gbkBytes = null;
110 for (int segIndex = 0xb0; segIndex <= 0xf7; segIndex++) {
for (int charIndex = 0xa1; charIndex <= 0xfe; charIndex++) {
gbkBytes = new byte[] { (byte) (segIndex), (byte) charIndex };
str = new String(gbkBytes, "GBK");
lastNameMap.put(index++, str);
115 System.out.println(str);
}
}
}
120 对于VALIDSTATUS,一般进行删除操作的时候为了数据安全,并不直接将数据从数
据库中删除,而是使用VALIDSTATUS 标识进行逻辑删除标识,为1 时代表数据有效,为
0 是代表逻辑删除。
CHANGEDATE 为了索引在增量添加的时候查找需要添加的增量部分而设定。
2.3.2 索引模型
125 对于索引建立,对应数据库选定需要的内容,关键代码如下:
<fields>
<field name="USERCODE" type="string" indexed="true" stored="true"/>
<field name="USERNAME" type="textMaxWord" indexed="true" stored="true"/>
<field name="COMCODE" type="text" indexed="true" stored="true"/>
130 <field name="VALIDSTATUS" type="text" indexed="true" stored="true"/>
<field name="CHANGEDATE" type="date" indexed="true" stored="true"/>
</fields>
<uniqueKey>USERCODE</uniqueKey>
<defaultSearchField>USERNAME</defaultSearchField>
135 <solrQueryParser defaultOperator="OR"/>
其中indexed="true"代表对这一栏建立索引,stored="true"代表存储这部分数据,待查询
后可直接查看这部分数据。defaultSearchField 为默认搜索的域。solrQueryParser
defaultOperator 代表当采用多个查询参数时使用OR 来进行连接,例如查询“王 一”系统中
会按照“王OR 一”来进行查找。
140 2.4 分词和词库
分词器的选取不仅影响到整个引擎的效率还对检索结果的准确度有决定性的作用。目前
比较流行的分词器主要有paoding ,imdict ,mmseg4j ,ik。paoding :Lucene 中文分词“庖
丁解牛” Paoding Analysis;imdict :imdict 智能词典所采用的智能中文分词程序;mmseg4j :
用 Chih-Hao Tsai 的 MMSeg 算法 实现的中文分词器;ik :采用了特有的“正向迭代最细
145 粒度切分算法“,多子处理器分析模式。经过从开发者及开发活跃度, 用户自定义词库,
速度,算法和代码复杂度,帮助文档等方面[4]综合考虑,决定使用Mmseg4j 分词器。MMSeg
算法有两种分词方法:Simple 和Complex,都是基于正向最大匹配。Complex 加了四个规
则过虑。官方说:词语的正确识别率达到了 98.41%。mmseg4j 已经实现了这两种分词算法,
1.6 版在complex 基础上实现了最多分词(max-word)。
150 2.5 索引管理
2.5.1 数据库导入配置
执行数据库导入DataImportHandler 需要对Solr 进行一些数据库相关配置。关键配置如
下:
<dataSource type="JdbcDataSource" name="ds-1" driver="oracle. jdbc.driver. OracleDriver"
155 url="jdbc:oracle:thin:@192.168.2.190:1521:orcl" user="arch4platform"
password="arch4platform"/>
这部分是配置数据库关联数据,配置了数据库名,访问用户名密码等关键信息。
<entity name="PRPDUSER" dataSource="ds-1" PK="USERCODE" processor =
"SqlEntityProcessor "
160 deltaQuery="select USERCODE from PRPDUSER where to_char (CHANGEDATE ,
'yyyy-mm-dd hh:mi:ss' ) > '${dataimporter.last_index_time}'"
query="select from PRPDUSER"
deltaImportQuery="select from PRPDUSER where USERCODE ='$
{dataimporter.delta.USERCODE}'"
165 deletedPkQuery="SELECT from PRPDUSER where VALIDSTATUS ='0'">
这部分为执行导入时非常重要的部分。deltaQuery 和deltaImportQuery 为执行增量导入
时的数据库查询语句,选择CHANGEDATE 的时间大于上次执行导入的时间的条目,实现
部分增量导入,节省了全部导入重复内容浪费的时间。Query 未执行完全导入时执行的数据
学术论文网Tag:代写论文 论文发表 计算机论文 职称论文发表
|
本站郑重声明:
1、我们与数十所知名高校博士强强联手,保持常年稳定合作关系,论文质量更有保证;;
2、写作领域涉及所有专业,实力操作,出稿更快,质量更高,通过率100%;
3、所有代写文章,全部原创,包检测,保证质量,后续免费修改,保证通过;
4、信誉实力服务,专业代写毕业论文,职称论文,硕博士论文,留学生论文,成熟操作;
------分隔线----------------------------