




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程计Lucene与搜索引擎区别luceneLuceneLucene(重点需求:使用Lucene完成信息的全文检索功能开发如何数据LukeField域属性学习(重点Query搜索结果TopDocs(重点什么是全文检顺序扫描法(Serial全文检索(Full-text——全文检索是一种将文件中所有文本与检索项匹配的文字资料检索方法。全文检索首先Search据查询索引,最终找到包含的文章。整个过程类似于查字典的过程。……图像、活动影像等非结构化数据进行综合管理的大型软件。本只讨本检索。对于数据量大、数据结构不固定的数据可采用全文检索方式搜索,比如、等搜索引擎、站内搜索、站内搜索等。什么是Luceneapache下的一个开放源代码的全文检索引擎工具包。提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene的目的是为软件开发人员提供一个简单易用的工Lucene引结构等功能。例如:搜索、eclipse帮助搜索、淘宝网商品搜索。对包含这些检索词的文章进行排序,最后输出排序的结果。全文检索技术是搜索引擎的Lucene和搜索引擎不同,Lucenejava或其它语言写的全文检索的工具包,为Lucene是开发全文检索功能的工具包,从Lucene4.10.3,并解压。Jdk要求:1.7Luceneorg.apache.lucene.Lucene mon-与、或、非等,生成查询表达式,数据管理,包括一些I/O操1、数系 MysqlapiapiJava索引库索引索引库索引IOMysql数据库mysql5.1eclipsemysql5.1驱动包:mysql-connector-java-5.1.7-bin.jarlucene包:lucene-core-4.10.3.jarlucene分析器通用包:lu lucene查询解析器包:lucene-queryparser-4.10.3.jarjunit包:junit-java工程加入以上jar为什么要数据全文检索要搜索的数据信息格式多种多样,拿搜索引擎(,)来说,通过搜索引擎能搜索互联上的网页(html)、互联网上的音乐(mp3..)、(avi..)、pdf电如何数据用一种爬虫程序抓取网页(httphtml网页信息:)solrapache库、xml web数据。jsoup(,jsoup是一款Java的HTML解析器,可直接解析某个URLHeritrix针对站内搜索功能,全文检索的数据源在数据库中,需要通过jdbc数据库中publicclasspublicclassBookprivateIntegerid;privateStringname;privateFloatprice;privateStringpic;privateStringDaopublicinterfaceBookDao publicList<Book>findBookList()throws}publicclassBookDaoImplimplementsBookDao查询privatestaticStringsql="SELECT*FROMpublicList<Book>findBookList()throwsExceptionConnectionconnection=预编译PreparedStatementpreparedStatement=ResultSetresultSet=List<Book>list=newtryconnection=DriverManager.getConnection("jdbc:mysql://localhost:3306/lucene","root",创建preparedStatementpreparedStatement=resultSet=while(resultSet.next()){Bookbook=new}}catch(Exceptione){}}}}return}}创建文档是Lucene对索引对外表示的逻辑结构,采用NOSql的理念,每个中有很多Field组成,Field中key/value对即name:XXX,value:XXX创建索引前要将要索引的内容用表示,这一步就相当于提取非结构数据的息然后结构化为形式。创建索引就是针对中的内容进行索引确切的说是针对中FieldBookDaoBookDaobookDao=new//从数据库中查 信List<Book>bookList=bookDao.findBookList(); >docs=newArrayList< for(Bookbook:bookList){ = TextFieldid=newTextField("id",//TextFieldname=newTextField("name",book.getName(),//FloatFieldprice=newFloatField("price",//TextFieldpic=newTextField("pic",book.getPic(),//TextFielddescription=newTextField("description",book.getDescription(),Store.YES);}descriptiondescriptionnamenamenamename field的个数可以不同,建议相同类型的文档包括相同的field。 对应一条book表的记录。 中field中的value值进行分词 中的Field的内容进行分词,将分好的词创建索引,索引=Field:创建索程 1、对原始内容信息抽取,并创建文档2、使用yzer分词器对文档中的内容进行分词IndexWriter是索引过程的组件,通过IndexWriter可以创建新索引、更新索引、删除索引操作。IndexWriter需要通过Directory对索引进行操作。类常用的包括FSDirectory(在文件系统索引、RAMDirectory(在内存索引。分词就是将原始文档内容切分成一个一个的词也就是将中Field的value值切分成过虑包括去除标点符号、去除停用词(的、是、a、an、the等、大写转小写、词的形态还Standardyzer,标准分词器可a/an/the等停用:LuceneisaJavafull-textsearchengine. Luceneisnotacompleteapplication,butratheracodelibraryandAPIthatcaneasilybeusedtoaddsearchcapabilitiestoapplications.yzeryzer=newyzeryzer=newIndexWriterConfigindexWriterConfig=Version.LUCENE_4_10_3, //创建索 流对Directorydirectory=FSDirectory.open(newIndexWriterindexWriter=newIndexWriter(directory,for:docs) }//LukeluceneLukecmd运行 -jarlukeall-索索 1querysql3、IndexSearcher通过IndexReader索引文件中6TopDocs的内容展示给用户。sql一样,lucene全文检索也有固定的语法:最基本的有比如:AND,OR,NOT等descriptionjavalucene关键字的文档。luke搜索的例子:lucene会首先对语法进行分析,判断语法关键字的正NOT、AND、OR,分别抽取出语法关键字和搜索关键字。比如:输入搜索关键字“javajavajava和培训有关根据关键字从索引中找到索引信息,索引即词term,term与 了term就找到了关联的 取出Field中的信息即是要搜索的信息。//// yzer=new ////QueryParserqueryParser=newQueryParser("description",Queryquery=queryParser.parse("description:javaAND//索 流对Directorydirectory=FSDirectory.open(new//索 对IndexReaderindexReader=//IndexSearcherindexSearcher=//执行搜索,取出符合记录的前100TopDocstopDocs=indexSearcher.search(query,for(ScoreDocintdocID=doc= Stringid=doc.get("id");Stringname=doc.get("name");Floatprice=Float.parseFloat(doc.get("price"));Stringdescription=doc.get("description"); }}索Field根据数据库中的信息表结构,改造中filed类FieldFieldFieldFieldField,Field的一个承载体,Field值即为要索引的内容,也是要搜索的内容。Field分词后进行索引也可以对整个Field进行索引。比如:名称、简介分词后进行索引,订单号、号不用分词但也要索引,这些将来都要作为查询条件,如果将来查询要根据表的主键id查询,那id也要索3、是否是:将Field值在文档中,在文档中的Field才可以从 中获取的Field都要。否:不Field值,不的Field无法通 据库中获取商品简介,思路是从lucene索引获取id,根据id查询关系数据库。FieldFiledFieldField字符NYY或这个Field用来构建一个字符串整个串在索引中,比如(订单是否在文档中LongYYY或这个Field用来构建一个Long数字型Field多种类NNY这个Field用来构建不同类FieldValueStore.NO)YYY或如果是一个Readerlucene猜测内容比较多,会采用Unstored的Field修改原来的创建代码StringFieldid=new//TextFieldname=newTextField("name",book.getName(),//FloatFieldprice=newFloatField("price",//商 ,不分词,不索引,//TextFielddescription=newTextField("description",book.getDescription(),Store.NO);【索引管理人员通过系统更改信息,这时更新的是数据库,如果使用lucene搜索图booklucene索引库。////yzeryzer=newIndexWriterConfigindexWriterConfig=Version.LUCENE_4_10_3, //创建索 流对Directorydirectory=FSDirectory.open(new//QueryParserqueryParser=newQueryParser("description", Queryquery=queryParser.parse("description:javaAND//IndexWriterindexWriter=newIndexWriter(directory, //}方式,所以在创建索引时需要创建一个主键Field比如id,它对应数据库表中的主键,Field删除。Lucene3.XLucene的回收站中,可以恢复删除的文档,3.X之后无 Termterm=newTerm("id","1");//doc= //商品idStringFieldid=new//TextFieldnamenewTextField("name","java",// (term,//说明:更新索引是先删除再添加,根据term找到匹配field的,并删除,再添加新的到索引库。建议将term设置为主键Field这样根据主键Field只会删除一搜QueryQuery查询对象,LuceneQuery查询对象生成最终的查询name:luceneFieldname为“lucene”的文档信息。LuceneQueryQuery是一个抽象类,lucene提供了很多查询对象,比如TermQueryQueryquery=Queryquery=newTermQuery(newTerm("name",QueryParserqueryParser=newQueryParserqueryParser=newQueryParser("name", Queryquery=////IndexReaderreader=//IndexSearcherindexSearcher=new//NumericRangeQuery<Long>numericRangeQuery=.newLongRangeNumericRangeQuery<Long>numericRangeQuery=.newLongRange("price",0l,200l,true,//.newLongRange("price",0l,200l,true,////BooleanBooleanQuerybooleanQuery=new//price0200//IndexSearchersearcher=newIndexSearcher(reader);Occur.MUSTandOccur.SHOULDorOccur.MUST_NOTnot非MUSTMUST_NOTMUST_NOT所对应得查询子句的检索结SHOULDMUST_NOTMUST和MUST_NOTSHOULDMUST连用时,结果为MUST子句的检索结果,SHOULDMUST_NOTMUST_NOTOccur.MUST_NOT//fQueryParserqueryParser=newQueryParser("f",descriptionQueryquery2=Queryquery2=上边介绍的基于类的查询方法,使用QueryParserFieldName:FieldName:[minTO索建议使用NumericRangeQuery。+price:[0TO200]price0200name为“java”,必须满足与BooleanQueryOccur+(加号 AND关键字OR:关键字 OR关键字NOT:关键字 NOT关键字12String[]fields= Queryquery=queryParser.parse("java");匹配搜索条件的录顶部匹配记录,Searchn条记录:indexSearcher.search(queryn),n表示指定中文分词yzeryzer是一个抽象类在Lucene的lu mon包中提供了很多分析器,比如:org.apache.lucene.ysis.standard.standardyzer标准分词器,它是Lucene的=toknewLowerCaseFilter(getVersiontok);//在标准分词过滤器的基础上加大小写转换过滤tok=newStopFilter(getVersion(),tok,stopwords);//在上边过滤器基础上加停用词过滤Tokenizer是分词器,负责将reader转换为语汇单元即进行分词,Lucene提供了很多的分词器,也可以使用第的分词,比如IK yzer一个中文分词器。IloveChina,love和China很容易被程序区分开是:我爱中国。Lucene 二分法分词:按两个字进行切分。如:“我人”,效果:“我是”、“是中”、“中国”“国上边两个分词器需求第产品介 IKyzerjava2006年121.0IKyzer4Luence2012版本中,IKIK分词器从单纯的词典分词向模用Chih-HaoTsai的MMSeg算法()实现的中文分词器,并实现lucene的yze
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 出国派遣合同范例
- 代理协议合同范例诉讼
- 修枝整形专项施工方案
- 中介备案合同范例
- 养老合同附加合同范例
- 双壁钢围堰施工方案
- 住宅消防保养合同范例
- 八年级学生数学语言转换能力调查研究
- 混联外骨骼肘腕康复机构运动性能及康复效果评估
- 机器人与3D导板辅助腰椎皮质骨轨迹置钉技术解剖应用研究
- GB 4806.7-2016食品安全国家标准食品接触用塑料材料及制品
- 肾病综合征【内科学课件】
- 珍珠球运动-课件
- 线性代数电子教案(全套)课件
- 《药品储存与养护》考试复习题库(含答案)
- 食品添加剂采购使用台账(二)
- 小学生心理健康教育讲座课件
- QuickBooks操作手册范本
- 舆论学教程PPT整本书课件完整版电子教案全套课件最全教学教程ppt(最新)
- 危险化学品物质安全告知卡(硫酸)
- DB4403∕T 54-2020 停车库(场)交通设施建设与管理规范
评论
0/150
提交评论