第十五阶段lucene技术教案_第1页
第十五阶段lucene技术教案_第2页
第十五阶段lucene技术教案_第3页
第十五阶段lucene技术教案_第4页
第十五阶段lucene技术教案_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Lucene介Luceneapache下的一个开源的全文检索引擎工具包。它为软件开发人员提供一个简站内搜索(关注SearchLucene实现全文检索的流索程:即数据→构建文档对象→分析文档(分词)→创建索引3程使用Lucene实现项目中类商品的索引和搜索功能JdkIde环境:eclipseLucene安Lucene是开发全文检索功能的工具包,使用时从,并解压。:目前版本地址:JDK要求:1.7以上(4.81.7以下工程搭建(两步javajarjar 索为什么要数索引擎能搜索互联上的网页(html)、互联网上的音乐(mp3..)、(avi..)、pdf电子非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等。like查询,likelike如何数2、如果数据在数据库中就连接数据库表中的数据网页(了解((httphtml网页信息库、xml)solrapache jsoup址、HTMLAPIDOM,CSS Heritrix数据库(掌握针对站内搜索功能,全文检索的数据源在数据库中,需要通过jdbc数据库bookpublicpublicclassBook privateInteger//名privateString//价privateFloat//privateString//描privateString}publicpublicinterfaceBookDao publicList<Book>queryBookList()throws}publicclassBookDaoImplimplementsBookDaopublicList<Book>queryBookList()throwsExceptionConnectionconnection=预编译PreparedStatementpreparedStatement=ResultSetresultSet=列List<Book>list=newtryconnection=DriverManager.getConnection("jdbc:mysql://localhost:3306/solr","root","root");SQLStringsql="SELECT*FROM创建preparedStatement=resultSet=while(resultSet.next()){Bookbook=newBook();}}catch(Exceptione){}return}}Field(域descriptiondescriptionbooknamebooknamebooknamebookname field的个数可以不同,建议相同类型的文档包括相同的field。 对应一条book表的记录。 中的Field的内容进行分词,将分好的词创建索引,索引=Field:创建索程索 索 除索引操作。IndexWriter需要通过Directory对索引进行操作。个抽象类,它的子类常用的包括FSDirectory(在文件系统索引、RAMDirectory(在内存索引。创数据的目的是为了索引,在索引前需要将原始内容创建成文档 , (Field代码实BookDaodao=newList<Book>list=>docList=newdoc=for(Bookbook:list)//创 doc= 根据需求创建不同的Fieldid=newTextField("id",book.getId().toString(), Fieldname=newTextField("name",book.getName(),Store.YES);Fieldprice=newTextField("price",Fieldpic=newTextField("pic",book.getPic(),Store.YES);Fielddesc=newTextField("description",book.getDescription(),}分分词过Docuemnt分词就是将到的文档内容切分成一个一个的词具体应该说是将中过虑包括去除标点符号、去除停用词(的、是、a、an、the等、大写转小写、词的形 注意由于语言不同分析器的切分规则也不同,本例子使用Standard ponents ponents(finalStringfieldName,finalreader)finalStandardTokenizersrc=newStandardTokenizer(getVersion(),reader);TokenStreamtok=newStandardFilter(getVersion(),src);tok=newLowerCaseFilter(getVersion(),tok);tok=newStopFilter(getVersion(),tok,returnnew ponents(src,tok){protectedvoidsetReader(finalReaderreader)throwsIOException{ }}如下是 yzer的部分源码Tokenizer是分词器,负责将reader转换为语汇单元即进行分词,Lucene提供了很多的分词器,也可以使用第的分词,比如IK yzer一个中文分词器。Lucene提供了很多的分词器过滤器,比如大小写转换、去除停用词等。从一个Reader字符流开始,创建一个基于Reader的TokenizerLuceneLuceneisaJavafull-textsearch例如:信息里面,名称中的java和描述中的java对应不同的代码实 yzer=new 创建索////分析文档,对文档中的field域进行分 yzer=new aDirectorydirectory=FSDirectory.open(newFile("E:\\11-b创建IndexWriterConfigIndexWriterConfigcfg=new c创建IndexWriterIndexWriterwriter=newIndexWriter(directory,//d)通过IndexWriter对象添加文档对象 for :docList) }f关闭IndexWriterLuke查看Luke作为Lucene工具包中的一个工具(可以通过界面来Luke命令运行:cmd运行 索索 sql语句。3、IndexReader索引对象,它对应的索引对象IndexWriter,IndexSearcher通IndexReader索 4、Directory索对象,IndexReader需要Directory索引库,使用FSDirectory文件系sql一样,lucene全文检索也有固定的语法:最基本的有比如:AND,OR,NOT等descriptionjavalucene关键字的文档。它对应的查询语句:description:javaANDlucene比如:输入搜索关键字“javajavajava和培训有关根据关键字从索引中找到对应的索引信息,即词term。term与 了term就找到了关联的 取出Field中的信息即是要搜索的信息。查询查询索publicvoidsearcherIndex()throwsException1(Query对象 yzer=newQueryParserqueryParser=newQueryquery=queryParser.parse("description:javaAND2a)Directorydirectory=FSDirectory.open(newFile("E:\\11-b)创建IndexReaderIndexReaderreader=c)创建IndexSearcherIndexSearchersearcher=newd)通过IndexSearcher对象执行查询索引库,返回TopDocsTopDocstopDocs=searcher.search(query,e)提取TopDocs对象中前nScoreDoc[]scoreDocs=topDocs.scoreDocs;System.out.println("查询出文档个数为:topDocs.totalHits);for(ScoreDocscoreDoc:scoreDocs){文档对象intdocId=doc=f)System.out.println("文档id:"+docId); id:"+doc.get("id")); name:"+doc.get("name")); price:"+doc.get("price")); pic:"+doc.get("pic")); description:"+}g)关闭IndexReader}FieldFieldFieldFieldField值两部分,一个文档可以包括多个Field,Field的一个承载体,Field值即为要索引的内容,也是要搜索的内容。是否分词是否索引是否是:将Field值在文档中,在文档中的Field才可以从 中获取的Field都要。否:不Field值,不的Field无法通过 FieldFiledFieldField字符NYY或这个Field用来构建一个字符串整个串在索引中,比如(订单号,号等)是否在文档中LongYYY或这个Field用来构建一个Long数字型Field,进行分词和索引,比是否在文档中多种类NNY这个Field用来构建不同类不分析,不索引,但要Field在档FieldValueStore.NO)YYY或如果是一个Readerlucene猜测内容比较多,会采用Unstored的Fieldid:id来搜索商品是否索引:不索引,因为不需要根据ID进行搜索是否:要,因为查询结果页面需要使用id这个值是否分词:要分词,因为要将的名称内容分词索引,根据关键搜索名称抽取的词。是否:要是 不是来不在lucene的索引文件中记录,节省lucene的索引文件空间,如果要在详情页从lucene中取出的id,根据的id查询关系数据库中book表得到描述信息//////参数:、域中的内容、是//不分词、索引、//Fieldid=newTextField("id",//Fieldid=newStoredField("id",book.getId().toString(),//名分词、索引Fieldbookname=newTextField("bookname",book.getName(),//价分词、索引Fieldprice=newFloatField("price",book.getPrice(),////不分词、不索引、Fieldpic=newStoredField("pic", 描//分词、索引、Fielddescription=newTextField("description",book.getDescription(),Store.NO);索引管理人员通过系统更改信息,这时更新的是数据库,如果使用lucene搜索图booklucene索引库。调用indexWriter.add 参考程序的创建索引。删除索删除索publicvoiddeleteIndex()throwsException1、指定索引Directorydirectory=FSDirectory.open(newFile("E:\\11-2、创建IndexWriterConfigcfg=newnew //3建IndexWriterwriter=newIndexWriter(directory,4、通过IndexWriter来删除索b)、删除指定索 s(newTerm("filename",5、关闭IndexWriter}删除全部索引(慎用将索 publicvoiddeleteIndex()throwsException1Directorydirectory=FSDirectory.open(newFile("E:\\11-2、创建IndexWriterConfigcfg=newnew 3IndexWriterwriter=newIndexWriter(directory,4、通过IndexWriter//a)、删除全部索引5、关闭IndexWriter}Field,Field删除。Lucene的回收站中,Lucene3.X版本可以恢复删除的文档,3.X之后修改修改索publicvoidupdateIndex()throwsException1、指定索引Directorydirectory=FSDirectory.open(newFile("E:\\11-2、创建IndexWriterConfigcfg=newnew //3建IndexWriterwriter=newIndexWriter(directory,4、通过IndexWriter来修改索a)、创建修改后的文档对= 文件名FieldfilenameField=newStringField("filename","updateIndex",//// (newTerm("filename",5、关闭}搜Query查询对象,LuceneQuery查询对象生成最终的查询name:lucene”Fieldname为“lucene”的文档信息。LuceneQueryQuery是一个抽象类,lucene提供了很多查询对象,比如TermQueryNumericRangeQuery数字范围查询等。 Queryquery=newTermQuery(newTerm("name", QueryParserqueryParser=newQueryParserqueryParser=newQueryParser("name",newQueryquery=QueryprivatevoiddoSearch(Queryquery){IndexReaderreader=null;tryprivatevoiddoSearch(Queryquery){IndexReaderreader=null;trya指定索引Directoryindexdirectory=FSDirectory.open(newFile(b创建IndexReader对reader=c创建IndexSearcher对IndexSearchersearcher=new//d)通过IndexSearcher对象执行查询索引库,返回TopDocs对//第一个参数:查询//第二个参数:最大的n条记TopDocstopDocs=searcher.search(query,//e)提取TopDocs对象中的文档ID,如何找出对应的ScoreDoc[]scoreDocs=System.out.println("总共查询出的结果总数为:topDocs.totalHits);for(ScoreDocscoreDoc:scoreDocs)文档对象intdocId=scoreDoc.doc;doc=searcher.doc(docId);f输出文档内}}catch(IOExceptione){}finallyif(reader!=null)try{}catch(IOExceptione){}}}}publicvoidtestTermQuery()throwsException1建查询(Query对象Queryquery=newTermQuery(newTerm("filename",2行搜}publicvoidtestNumbericRangeQuery()throwsException创建查第一个参数//第二个参数:最小//第三个参数:最大//第四个参数:是否包含最小//第五个参数:是否包含最大Queryquery=NumericRangeQuery.newLongRange("size",1l,100l,2行搜}publicvoidbooleanQuery()throwsException{BooleanQueryquery=publicvoidbooleanQuery()throwsException{BooleanQueryquery=newQueryquery1=newTermQuery(newTerm("id",Queryquery2=NumericRangeQuery.newFloatRange("price",10f,true,//MUST:查询条件必须满足,相当于//SHOULD:查询条件可选,相当于query.add(query1,Occur.MUST);query.add(query2,Occur.SHOULD);}3、MUST_NOT和MUST_NOT4、SHOULDMUST表示MUST,SHOULD5、SHOUlDMUST_NOT相当于MUSTMUST_NOT6、SHOULDSHOULDQueryParserQueryParserQuery,QueryParserParse方法,此方法可以直接根据查询语法来查询。QuerySystem.out.println(query);查询。代码实publicvoidtestQueryParser()throwsException创建//第一个参数:默//第二个参数:分词QueryParserqueryParser=newQueryParser("name",newIK//指定查询语法,如果不指定域,就搜索默认的域QueryqueryqueryParser.parse("lucene");2行搜}查询语+++“:”+[TO最大值]例如:size:[1TO1000]索建议使用NumericRangeQuery+(加号+++12:必须满足第一个条件,忽略第二个条件例如:+filename:apachecontent:apache12:两个条件满足其一即可。例如:filename:apachecontent:apache4)-1211AND1OR1NOTpublicvoidpublicvoidtestMultiFieldQueryParser()throwsException//可以指定默认搜索的域是多String[]fields={"name","description"//创建一个MulitFiledQueryParser对QueryParserparser=newMultiFieldQueryParser(fields,new //指定查询语法,如果不指定域,就搜索默认的Queryquery=2行搜}匹配搜索条件的录,相关度排Lucene对查询关键字和索引文档的相关度进行打分,得分高的就排边。如何打分呢Term在此文档中出现了多少次。tfLucene技术的。Frequency(df):Term。df文档包含此词(Term),说明此词(Term)太普通,不足以区分这些文档,因而重要性越低。boost1.0f,在索引时对某个文档中的field设置值高,在搜索时匹配到这个文档就可能排设置boost是给域(field)或 设置的FieldBoost1.0f。一旦设定,除非删除此文档,否则无法改变。代码实publicvoidsetBoost4createIndex()throwsException创建分词 yzer=new IndexWriterConfigcfg=newIndexWriterConfig(Version.LUCENE_4_10_3,Directorydirectory=FSDirectory.open(newFile("E:\\11-//创建IndexWriter对象,通过它把分好的词写到索引库IndexWriterwriter=newIndexWriter(directory,doc=Fieldid=newStringField("id","11",FielddescriptionnewTextField("description测试设置BOOSTlucene",//设置boost//把域添加到文档 关闭IndexWriter}输代码实输未设 值中文分词格

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论