当前位置:首页 > 商业/管理/HR > 销售管理 > lucene开发指南
北京信息科技大学MichaelLucene全文检索技术北京信息科技大学Michael知识点:1.Lucene入门-Lucene介绍152.Lucene入门-全文检索过程概述203.Lucene入门-索引-采集数据204.Lucene入门-索引-文件逻辑结构155.Lucene入门-索引-创建Document206.Lucene入门-索引-创建索引207.Lucene入门-索引-使用Luke查看索引158.Lucene入门-搜索-搜索索引209.Lucene深入-Field属性-理论2010.Lucene深入-Field属性-代码实现1011.Lucene深入-索引维护1512.Lucene深入-Query查询-Query对象2013.Lucene深入-Query查询-QueryParser2014.Lucene深入-TopDocs1015.Lucene深入-相关度排序boosts2016.Lucene深入-中文分词器20北京信息科技大学Michael1Lucene入门1.1Lucene是什么?Lucene是apache下的一个开放源代码的全文检索引擎工具包。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能。1.2全文检索的应用场景使用全文检索技术可以实现如下功能:搜索引擎:Lucene和搜索引擎不同,Lucene是一套用java或其它语言写的全文检索的工具包,为应用程序提供了很多个api接口去调用,可以简单理解为是一套实现全文检索的类库,搜索引擎是一个全文检索系统,它是一个单独运行的软件。站内搜索:北京信息科技大学Michael1.3Lucene全文检索过程全文检索首先将要搜索的目标文档中的词提取出来,组成索引,通过查询索引达到搜索目标文档的目的。这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-textSearch)。1.3.1【图示】整个全文检索过程分为两个过程,索引和搜索。1.3.2需求我们对全文检索的分析以一个电商网站的站内搜索为例进行分析,本例子以搜索图书为例进行讲解。1.3.3安装luceneLucene是开发全文检索功能的工具包,从官方网站下载Lucene4.10.3,并解压,lucene的jar北京信息科技大学Michael加入工程中使用即可。官方网站:版本:lucene4.10.3lucene的包结构如下:包名功能org.apache.lucene.analysis语言分析器,主要用于的切词Lucene提供的分析器实现类在:lucene-analyzers-common-4.10.3.jarorg.apache.lucene.document索引存储时的文档结构管理,类似于关系型数据库的表结构org.apache.lucene.index索引管理,包括索引建立、删除等org.apache.lucene.queryParser查询分析器,实现查询关键词间的运算,如与、或、非等,生成查询表达式,org.apache.lucene.search检索管理,根据查询条件,检索得到结果org.apache.lucene.store数据存储管理,包括一些I/O操作org.apache.lucene.util公用类1.3.4准备环境jdk1.7lucene-4.10.3mysql5.1eclipseindigojar:mysql5.1驱动包:mysql-connector-java-5.1.7-bin.jarlucene核心包:lucene-core-4.10.3.jarlucene分析器通用包:lucene-analyzers-common-4.10.3.jarlucene查询解析器包:lucene-queryparser-4.10.3.jarjunit包:junit-4.9.jar创建java工程加入以上jar包。北京信息科技大学Michael1.3.5索引过程1.3.5.1为什么要采集数据?全文检索要搜索的数据信息格式多种多样,拿搜索引擎(百度,google)来说,通过搜索引擎网站能搜索互联网站上的网页(html)、互联网上的音乐(mp3..)、视频(avi..)、pdf电子书等。全文检索搜索的这些数据称为非结构化数据。什么是非结构化数据?结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等。如何对结构化数据搜索?由于结构化数据是固定格式,所以就可以针对固定格式的数据设计算法来搜索,比如数据库like查询,like查询采用顺序扫描法,使用关键字匹配内容,对于内容量大的like查询速度慢。如何对非结构化数据搜索?需要将所有要搜索的非结构化数据通过技术手段采集到一个固定的地方,将这些非结构化的数据想办法组成结构化的数据,再以一定的算法去搜索。1.3.5.2【如何采集数据?】采集数据技术有哪些?1、对于互联网上网页采用http将网页抓取到本地生成html文件。2、如果数据在数据库中就连接数据库读取表中的数据。3、如果数据是文件系统中的某个文件,就通过文件系统读取文件的内容。以上技术中使用第一种较多,因为目前全文检索主要搜索数据的来源是互联网,搜索引擎使用一种爬虫程序抓取网页(通过http抓取html网页信息),以下是一些爬虫项目(了解):Solr(),solr是apache的一个子项目,支持从关系数据库、xml文档中提取原始数据。Nutch(),Nutch是apache的一个子项目,包括大规模爬虫工具,能够抓取和分辨web网站数据。jsoup(),jsoup是一款Java的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。heritrix(),Heritrix是一个由java开北京信息科技大学Michael发的、开源的网络爬虫,用户可以使用它来从网上抓取想要的资源。其最出色之处在于它良好的可扩展性,方便用户实现自己的抓取逻辑。针对电商站内搜索功能,全文检索的数据源在数据库中,需要通过jdbc访问数据库中book表的内容。创建Dao负责采集数据库中的数据:publicinterfaceBookDao{//图书查询publicListBookfindBookList()throwsException;}publicclassBookDaoImplimplementsBookDao{//查询sqlprivatestaticStringsql=SELECT*FROMbook;@OverridepublicListBookfindBookList()throwsException{//数据库链接Connectionconnection=null;//预编译statementPreparedStatementpreparedStatement=null;//结果集ResultSetresultSet=null;//区域列表ListBooklist=newArrayListBook();try{//加载数据库驱动Class.forName(com.mysql.jdbc.Driver);//连接数据库connection=DriverManager.getConnection(jdbc:mysql://localhost:3306/lucene,root,mysql);//创建preparedStatementpreparedStatement=connection.prepareStatement(sql);//获取结果集resultSet=preparedStatement.executeQuery();//结果集解析北京信息科技大学Michaelwhile(resultSet.next()){Bookbook=newBook();book.setId(resultSet.getInt(id));book.setName(resultSet.getString(name));book.setPrice(resultSet.getFloat(price));book.setPic(resultSet.getString(pic));book.setDescription(resultSet.getString(description));list.add(book);}}catch(Exceptione){e.printStackTrace();}returnlist;}}北京信息科技大学Michael1.3.5.3【索引文件逻辑结构】索引域文档域DocumentField(域)Name:idValue:1Field(域)Name:nameValue:java编程思想Field(域)Name:picValue:23488292934.jpgField(域)Name:priceValue:71.5DocumentField(域)Name:idValue:2Field(域)Name:nameValue:luceneField(域)Name:picValue:77373773737.jpgField(域)Name:priceValue:66name:javaname:lucenename:springname:mybatisdescription:mybatisdescription:java……Field(域)Name:decriptionValue:Lucene是一个纯java的全文检索的工具包文档域:对非结构化的数据统一格式为document文档格式,一个文档有多个field域,不同的文档其field的个数可以不同,建议相同类型的文档包括相同的field。本例子一个document对应一条book表的记录。索引域:用于搜索,搜索程序将从索引域中搜索一个一个词,根据词找到对应的文档。将Document中的Field的内容进行分词,将分好的词创建索引,索引=Field域名:词倒排索引表传统方法是已知文件在文件中找内容,在文件内容中匹配搜索关键字,这种方法是顺序扫描方法,数据量大就搜索慢。倒排索引结构是根据关键字(词语)找文档,倒排索引结构也叫反向索引结构,包括索引和文档两部分,索引即词汇表,它是在索引中匹配搜索关键字,由于索引内容量有限并且采用固定优化算法搜索速度很快,找到了索引中的词汇,词汇与文档关联,从而最终找到了文档。北京信息科技大学Michael1.3.5.4如何创建索引?创建索引流程:IndexWriter是索引过程的核心组件,通过IndexWriter可以创建新索引、更新索引、删除索引操作。IndexWriter需要通过Directory对索引进行存储操作。Directory描述了索引的存储位置,底层封装了I/O操作,负责对索引进行存储。它的子类常用的包括FSDirectory(在文件系统存储索引)、RAMDirectory(在内存存储索引)。1.3.5.4.1【创建Document】Document是Lucene对索引对外表示的逻辑结构,Document采用NOSql的存储理念,每个Document中有很多Field组成,Field中存储key/value对即name:XXX,value:XXX创建索引前要将要索引的内容用Document表示,这一步就相当于提取非结构数据的信息然后结构化为Document形式。创建索引就是针对Document中的内容进行索引,确切的说是针对Document中Field域中的内容进行索引。BookDaobook
本文标题:lucene开发指南
链接地址:https://www.777doc.com/doc-2886278 .html