基于Lucene与Socket通信的中文搜索引擎的设计与实现
2017-04-14曹书林吕青松王一帆尹乾郑新
曹书林,吕青松,王一帆,尹乾,郑新
(北京师范大学信息科学与技术学院,北京,100875)
基于Lucene与Socket通信的中文搜索引擎的设计与实现
曹书林,吕青松,王一帆,尹乾,郑新
(北京师范大学信息科学与技术学院,北京,100875)
Lucene是一个用Java写的全文检索引擎工具包,面向对象多层封装,提供了一个低耦合、与平台无关的、可进行二次开发的全文检索引擎架构,是这几年最受欢迎的信息检索程序库;基于流式 Socket的网络编程是设计网络通信程序的一种有效方法。本文基于Lucene,采用中文分词技术,设计并实现了中文搜索引擎,同时应用Java和PHP的Socket网络编程技术,实现了外网通过PHP网页使用Lucene服务的功能。
中文搜索引擎;Lucene;Socket;中文分词;java;PHP
0 引言
中文搜索引擎是指以网络上的中文信息为主要对象,提供信息的自动收集、过滤、索引和检索导航等服务的搜索引擎[1]。本文在Lucene的基础上,进行二次开发,设计了搜索引擎核心的三大模块:索引模块,检索模块和web交互模块,使用了中文分词技术和关键词高亮显示技术,实现了按关键词快速搜索的界面友好的中文搜索引擎。
1 系统架构设计
搜索引擎有基本的五大模块,分别是信息采集,信息处理,索引,查询和web交互。本文研究的是如何在信息处理分析的基础上,建立一个完整的中文搜索引擎。所以该系统主要由三部分组成:建立索引库,建立查询服务器,建立web交互。
2 建立索引库
Lucene将文本以倒排索引的数据结构进行存储,把文档中提取出来的文字作为关键字[2],该倒排索引的基本结构如下:
一个Document代表索引库的一个文档。要搜索的信息封装成Document后通过IndexWriter写入索引库,这也是能返回给用户作为搜索结果的独立单元。
一个Document的组成是列,叫做Field。Document可以通过add方法根据需要增加列。
首先,Lucene使用分词器对经过预处理的纯文本字节流进行分词;然后,调用Document类的add方法生成field实例,创建文档;最后,使用IndexWriter将Document写入索引库。
2.1 中文分词器的选择
中文文本中词和词之间不像英文一样存在边界,所以中文分词是一个专业处理中文搜索引擎中首先应该面对的问题。
Lucene提供了一些分词技术,如按字符间空格进行分词的WhiteSpaceAnalyzer,按停用词划分的StopAnalyzer和使用更普遍的StandardAnalyzer,但是这些分词方法都基本是针对西方文字开发的。以“我爱计算机”为例,使用StandardAnalyzer的分词结果为“我/爱/计/算/机”,显然这种单字划分的方式是不准确的。
在这里,我们采用SmartChineseAnalyzer分词器,该分词器专为中文设计,分词效果“我/爱/计算机”比较理想,而且其本身在Lucene工具包中已经实现,所以本系统直接采用SmartChineseAnalyzer进行分词,解决了中文分词问题。
2.2 创建索引库
对文本进行中文分词等分析之后,就可以创建索引库。核心代码如下:
(1)创建Directory
(2)创建IndexWriter
(3)创建document对象
(4)为document添加field对象
(5)调用add方法,为document添加”class” filed,其他field类似
(6)使用完成后需要将writer进行关闭
3 建立搜索查询服务器
用户在Web接口中输入查询的关键词,然后发出搜索请求,由搜索查询服务其解析查询请求,通过Lucene的核心类IndexSearch完成搜索功能,经过处理返回给用户。本系统实现了如下两个方面。
3.1 IndexSearch类实现搜索
用户的搜索请求被分词后,调用Lucene的检索器IndexSearch进行搜索,返回Topdocs类。核心代码如下。
(1)创建Directory
(2)创建IndexReader
(3)根据IndexWriter创建IndexSearcher
(4)创建parser用来确定搜索的内容,第二个参数表示搜索的域
(5)根据Searcher返回TopDocs
(6)根据TopDocs获取ScoreDoc
(7)根据Searcher和ScoreDoc获取搜索到的document对象
(8)根据document对象获取查询的字段
(9)关闭reader
(10)返回搜索结果
3.2 关键词高亮显示
自定义一个关键词高亮显示函数displayHTMLHight。核心代码如下。
(1)设置中文分词器为SmartChineseAnalyzer(2)设置高亮标签,可以自定义
(3)创建QueryScorer,对query进行评分
(4)创建Fragmenter,对原始信息进行切片处理,选择最有价值的信息进行高亮处理
(5)创建高亮分析器,根据formatter和scorer选择最有价值的信息进行高亮处理
4 建立Web交互
为了使用户从服务器上获取网页内容,还要客户端与服务端进程建立连接。UDP和TCP的通信采用Socket方法连接。本系统使用Socket流式通信,实现了客户端和服务端的通讯功能。
4.1 Java实现服务器端
(1)首先创建一个ServerSocket对象,并为运行该语句的计算机的指定端口建立一个监听服务,这里绑定端口号为5678。
(2)为了随时监听可能的客户端请求,还要执行语句Socket client=server.accept();使Server处于等待状态,直到捕获到一个来自客户端的请求,并返回一个用于与该客户端通信的client对象。
(3)in为接受的客户端请求
(4)out为将要返回客户端的搜索结果
(5)调用IndexSearch函数,返回搜索结果,并发送给客户端
(6)刷新,提高IO吞吐率
(7)监听结束后,需要关闭client对象
4.2 PHP实现客户端
为了使用户可以通过外网使用搜索查询服务,本系统采用PHP的Socket通信。关键操作如下。
(1)首先,建立两个变量来保存服务器的IP地址和端口。
(2)在服务器端可以使用set_time_out()函数来确保PHP在等待客户端连接时不会超时.。
(3)使用socket_creat()函数创建一个Socket,这个函数返回一个Socket句柄,这个句柄将用在以后所有的函数中。其中“AF_INET”“SOCK_STREAM”“SOL_TCP”为指定创建//IPV4网络协议的、流式的、TCP类型的Socket。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_ TCP);
(4)通过socket_connet函数绑定Socket到指定的IP和端口,与服务器建立连接。
$result = socket_connect($socket, $ip, $port);
$cont = $_GET[“search”];
(5)将用户的搜索内容$cont从UTF-8转为GB2312,并保存为$in。这就是要发送到服务器端的内容。
$in = iconv(“utf-8”,”gb2312//IGNORE”,$cont).” n”;$out =‘’;
(6)通过socket_write函数向服务器发送搜索请求。
if(!socket_write($socket, $in, strlen($in))) {
echo“socket_write() failed: reason:“ .“ ”;
}
(7)通过socket_read()函数接受服务器的搜索结果,将搜索结果从UTF-8转化为GB2312
保存为$out并输出,将搜索结果展现给用户。
$out = socket_read($socket,1024
(8)关闭Socket对象
socket_close($socket);
5 结束语
通过建立索引库,搜索查询服务器,以及Web交互,我们基本实现了搜索引擎的核心功能,建立了具有中文分词和关键词高亮显示功能的中文搜索引擎系统。总体来讲,该中文搜索引擎具有很好的可维护性和可扩展性,可以在此基础上开发适应不同业务需求的搜索引擎,如在本系统的基础上进行二次开发的简体中文版儿童搜索引擎。
[1]吴娱.中文搜索引擎的现状与展望[J].现代情报,1999,(3):40-44.
[2]姜元爽,谭培,刘馨元,吕加国.基于Lucene的垂直搜索引擎的设计与实现[J].福建电脑, 2015,31(12):21-22.
Design and implementation of Chinese search engine based on Lucene and Socket communication
Cao Shulin, Lv Qingsong,Wang Yifan,Yin Qian,Zheng Xin
(School of information science and technology, Beijing Normal University,Beijing, 100875)
Lucene is a full-text search engine toolkit written in Java, an object-oriented, multi-tier package that provides a low-coupling, platform-independent and full-text search engine architecture. The network programming based on streaming Socket is an effective method to design the network communication program. Based on Lucene, this paper designs and implements the Chinese search engine by using Chinese word segmentation technology. At the same time, it uses Java and PHP Socket network programming technology to realize the function of using Lucene service through PHP website.
Chinese search engine; Lucene; Socket; Chinese word segmentation; java; PHP
尹乾
国家自然科学基金(No.61472043)。