lucene全文检索

上传人:仙*** 文档编号:67110484 上传时间:2022-03-30 格式:PPT 页数:45 大小:2.61MB
收藏 版权申诉 举报 下载
lucene全文检索_第1页
第1页 / 共45页
lucene全文检索_第2页
第2页 / 共45页
lucene全文检索_第3页
第3页 / 共45页
资源描述:

《lucene全文检索》由会员分享,可在线阅读,更多相关《lucene全文检索(45页珍藏版)》请在装配图网上搜索。

1、Lucene全文检索全文检索总体内容第一章:第一章: lucenelucene简介简介第二章:第二章: 入门实例入门实例第三章:第三章: 分析器分析器AnalyzerAnalyzer项目实践:构建一个简单的项目实践:构建一个简单的WEBWEB搜索程序搜索程序第一章:Lucene简介搜索引擎的历史搜索引擎的历史什么是什么是LuceneLucene全文检索系统的结构全文检索系统的结构为什么使用为什么使用LuceneLuceneLuceneLucene倒排索引原理倒排索引原理LuceneLucene只关注文本的索引和搜索只关注文本的索引和搜索NutchNutch搜索引擎的历史萌芽:萌芽:Archie

2、Archie、GopherGopher起步:起步:Robot(Robot(网络机器人网络机器人) )的出现与的出现与Spider(Spider(网络爬虫网络爬虫) )发展:发展:ExciteExcite、GalaxyGalaxy、YahooYahoo等等繁荣:繁荣:InfoseekInfoseek、AltaVistaAltaVista、GoogleGoogle和和BaiduBaidu 什么是Lucene LuceneLucene是非常优秀的成熟的是非常优秀的成熟的开源开源的的免费免费的的纯纯javajava语言语言的全的全文索引检索工具包。文索引检索工具包。 全文检索是指计算机索引程序通过扫描

3、文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。 LuceneLucene是一个高性能、可伸缩的信息搜索是一个高性能、可伸缩的信息搜索(IR)(IR)库。库。 Information Retrieval (IR) library.Information Retrieval (IR) library.它使你可以为你的它使你可以为你的应用程序添加索引和搜索能力。应用程序添加索引和搜索能力。LuceneLucene的作者的作者Doug CuttingDoug Cutting是资深的全文

4、索引是资深的全文索引/ /检索专家,检索专家,最开始发布在他本人的主页上,最开始发布在他本人的主页上,20012001年年1010月贡献给月贡献给APACHEAPACHE,成为成为APACHEAPACHE基金的一个子项目。基金的一个子项目。 http:/jakarta.apache.org/lucene/ 全文检索系统的结构 为什么使用LuceneLuceneLucene作为一个全文检索引擎,其具有如下突出的优点:作为一个全文检索引擎,其具有如下突出的优点: (1)索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引

5、文件。 (2)在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。 (3)优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。 (4)设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。 (5)已经默认实现了一套强大的查询引擎,用户无需自己编写代码即使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询(Fuzzy Search)、分组查询等等。开源开源, ,可

6、扩展能力强可扩展能力强, ,有各种语言版本有各种语言版本, ,适合各种平台适合各种平台, ,Lucene倒排索引原理假设有两篇文章假设有两篇文章1 1和和2 2 文章文章1 1的内容为:的内容为:TomTomliveslivesininGuangzhou,IGuangzhou,IliveliveininGuangzhouGuangzhoutoo.too. 文章文章2 2的内容为:的内容为:HeHeonceoncelivedlivedininShanghai. Shanghai. 经过分词处理后经过分词处理后 文章文章1 1的所有关键词为:的所有关键词为:tomtomliveliveguangz

7、houguangzhouiiliveliveguangzhouguangzhou 文章文章2 2的所有关键词为:的所有关键词为:heheliveliveshanghai shanghai 加上加上“出现频率出现频率”和和“出现位置出现位置”信息后,我们的索引结构为:信息后,我们的索引结构为:关键词文章号出现频率出现位置guangzhou123,6he211i114live12,212,5,2shanghai213tom111Lucene只关注文本的索引和搜索lucenelucene建立索引的来源建立索引的来源Nutch我们来大概了解一下我们来大概了解一下Nutch,Nutch,以及你将在哪方面

8、运用它?以及你将在哪方面运用它? 我还是先说一下Lucene吧。Lucene其实是一个提供全文文本搜索的函数库,它不是一个应用软件。它提供很多API函数让你可以运用到各种实际应用程序中。现在,它已经成为Apache的一个项目并被广泛应用着。这里列出一些已经使用Lucene的系统。Nutch 是一个建立在Lucene核心之上的Web搜索的实现,它是一个真正的应用程序。也就是说,你可以直接下载下来拿过来用。它在Lucene的基础上加了网 络爬虫和一些和Web相关的东东。其目的就是想从一个简单的站内索引和搜索推广到全球网络的搜索上,就像Google和Yahoo一样。当然,和那些巨人 竞争,你得动一些

9、脑筋,想一些办法。我们已经测试过100M的网页,并且它的设计用在超过1B的网页上应该没有问题。当然,让它运行在一台机器上,搜索一 些服务器,也运行的很好。 百度爬虫遐想 第二章:入门实例LuceneLucene的主要逻辑图的主要逻辑图创建索引创建索引索引查询索引查询帮助文档帮助文档理解核心索引类理解核心索引类理解核心搜索类理解核心搜索类更新索引中的更新索引中的Document Document Lucene的主要逻辑图 LuceneLucene功能强大,但从根本上说,功能强大,但从根本上说,主要包括两块:主要包括两块: 一是文本内容经切词后索引入库; 二是根据查询条件返回结果 创建索引创建索引

10、DirectoryindexDir=FSDirectory.open(newFile(INDEXDIR);IndexWriterwriter=newIndexWriter(indexDir,analyzer,true,MaxFieldLength.LIMITED);/2-索引目标索引目标Filefile=newFile(FILENAME);/3-规定索引范围,目标写入规定索引范围,目标写入Documentdoc=newDocument();doc.add(newField(name,file.getName(),Store.YES,Index.ANALYZED);doc.add(newFiel

11、d(content,IOUtils.readFileContent(file),Store.YES,Index.ANALYZED);doc.add(newField(size,NumericUtils.longToPrefixCoded(file.length(),Store.YES,Index.NOT_ANALYZED);doc.add(newField(path,file.getAbsolutePath(),Store.YES,Index.NOT_ANALYZED);writer.addDocument(doc);writer.optimize();/5-生成索引生成索引writer.cl

12、ose();索引查询/1-划定检索范围划定检索范围Stringfields=newStringname,content;QueryParserqp=newQueryParser(Version.LUCENE_36,fields,analyzer);/2-检索关键字检索关键字Stringkey=泽元软件泽元软件;Queryquery=qp.parse(key);/3-检索结果检索结果DirectoryindexDir=FSDirectory.open(newFile(INDEXDIR);Searchersearcher=newIndexSearcher(indexDir,true);TopDoc

13、stopDocs=searcher.search(query,100);帮助文档入库逻辑1.1.入入 库者定义到库中文档的结构,比如需要把网站内容加载到全文检索库,让库者定义到库中文档的结构,比如需要把网站内容加载到全文检索库,让用户通过用户通过“站内检索站内检索”搜索到相关的网页内容。入库文档结构与关系型数据库搜索到相关的网页内容。入库文档结构与关系型数据库中的表结构类中的表结构类 似,似,每个入库的文档由多个字段构成每个入库的文档由多个字段构成,假设这里需要入库的网,假设这里需要入库的网站内容包括如下字段:文章标题、作者、发布时间、原文链接、正文内容(一站内容包括如下字段:文章标题、作者、

14、发布时间、原文链接、正文内容(一般作为网页快照)。般作为网页快照)。2.2.包含包含N N个字段的文档(个字段的文档(DOCUMENTDOCUMENT)在真正入库前需要经过切词在真正入库前需要经过切词(或分词)索引,(或分词)索引,切词的规则由语言分析器(切词的规则由语言分析器(ANALYZERANALYZER)完成。)完成。3.3.切分后的切分后的“单词单词”被注册到索引树上,供查询时用,另外也需要把其它不需要被注册到索引树上,供查询时用,另外也需要把其它不需要索引的内容入库,所有这些是文件操作均由索引的内容入库,所有这些是文件操作均由STORAGESTORAGE完成。完成。4.4.Luce

15、neLucene的索引树结构非常优秀,是的索引树结构非常优秀,是LuceneLucene的一大特色。的一大特色。查询逻辑1.1.查询者输入查询条件查询者输入查询条件, ,条件之间可以通过特定运算符进行运算,比如查询希望条件之间可以通过特定运算符进行运算,比如查询希望查询到与查询到与“中国中国”和和“北京北京”相关的记录,但不希望结果中包括相关的记录,但不希望结果中包括“海淀区中关海淀区中关村村”,于是输入条件为,于是输入条件为“中国中国+ +北京北京- -海淀区中关村海淀区中关村”;2.2.查询条件被传达到查询分析器中,分析器将将对查询条件被传达到查询分析器中,分析器将将对“中国中国+ +北京

16、北京- -海海 淀区中关村淀区中关村”进行分析,首先分析器解析字符串的连接符,即这里的加号和减号,然后对每进行分析,首先分析器解析字符串的连接符,即这里的加号和减号,然后对每个词进行切词,一般最小的词元是两个汉字,则中国和北京两个词不必再个词进行切词,一般最小的词元是两个汉字,则中国和北京两个词不必再 切切分,但对海淀区中关村需要切分,假设根据切词算法,把该词切分为分,但对海淀区中关村需要切分,假设根据切词算法,把该词切分为“海淀区海淀区”和和“中关村中关村”两部分,则最后得到的查询条件可以表示为:两部分,则最后得到的查询条件可以表示为:“中国中国” ” AND AND “北京北京” ” AN

17、D NOTAND NOT(“海淀区海淀区” ” AND “AND “中关村中关村”)。3.3.查询器根据这个条件遍历索引树,得到查询结果,并返回结果集,返回的结果查询器根据这个条件遍历索引树,得到查询结果,并返回结果集,返回的结果集类似于集类似于JDBCJDBC中的中的ResultSetResultSet。4.4.将返回的结果集显示在查询结果页面,当点击某一条内容时,可以链接到原始将返回的结果集显示在查询结果页面,当点击某一条内容时,可以链接到原始网页,也可以打开全文检索库中存储的网页内容。网页,也可以打开全文检索库中存储的网页内容。5.5.这就是查询的逻辑过程,需要说明的是,这就是查询的逻辑

18、过程,需要说明的是,LuceneLucene默认只支持英文默认只支持英文,为了便于说,为了便于说明问题,以上查询过程采用中文举例,事实上,当明问题,以上查询过程采用中文举例,事实上,当LuceneLucene被扩充支持中文后就被扩充支持中文后就是这么一个查询过程。是这么一个查询过程。理解核心索引类 为了对文档进行索引,为了对文档进行索引,LuceneLucene 提供了五个基础的类提供了五个基础的类 public class IndexWriter org.apache.lucene.index.IndexWriter public abstract class Directory org.a

19、pache.lucene.store.Directory public abstract class Analyzer org.apache.lucene.analysis.Analyzer public final class Document org.apache.lucene.document.Document public final class Field org.apache.lucene.document.Field IndexWriterIndexWriterIndexWriter是在索引过程中的中心组件。是在索引过程中的中心组件。IndexWriterIndexWriter这

20、个类创建一个新的索引并且添加文档到一个这个类创建一个新的索引并且添加文档到一个已有的索引中。已有的索引中。你可以把你可以把IndexWriterIndexWriter想象成让你可以对索想象成让你可以对索引进行写操作的对象引进行写操作的对象,但是不能让你读取或搜索。,但是不能让你读取或搜索。IndexWriterIndexWriter不是唯一的用来修改索引的类不是唯一的用来修改索引的类org.apache.lucene.index.IndexWriter org.apache.lucene.index.IndexWriter public IndexWriter(Stringpath, Anal

21、yzera, booleancreate) Parameters: path - the path to the index directory a - the analyzer to use create - true to create the index or overwrite the existing one; false to append to the existing index Stringindex=C:tomcatwebappsindex1;IndexWriterwriter=newIndexWriter(index,newStandardAnalyzer(),true)

22、;DirectoryDirectoryDirectory类代表一个类代表一个LuceneLucene索引的位置。它是一个抽象类索引的位置。它是一个抽象类. .其中的两个实现其中的两个实现: : 第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。 第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。 在我们的在我们的IndexerIndexer示例中,我们使用一个实际文件系统目录示例中,我们使用一个实际文件系统目录的路径传递给的路径传递给IndexWriterIndexWriter的构造函数来获得的构造函数来获得DirectoryDirectory的

23、的一个实例。一个实例。IndexWriterIndexWriter然后使用然后使用DirectoryDirectory的一个具体实的一个具体实现现FSDirectoryFSDirectory,并在文件系统的一个目录中创建索引。,并在文件系统的一个目录中创建索引。 Analyzer在一个文档被索引之前,首先需要对文档内容进行在一个文档被索引之前,首先需要对文档内容进行分词处分词处理理,并且而剔除一些冗余的词句(例如:,并且而剔除一些冗余的词句(例如:a a,the,theythe,they等等),),这部分工作就是由这部分工作就是由 Analyzer Analyzer 来做的。来做的。 Anal

24、yzer Analyzer 类是一个抽象类,它有多个实现。类是一个抽象类,它有多个实现。BrazilianAnalyzer, ChineseAnalyzer, CJKAnalyzer, CzechAnalyzer, DutchAnalyzer, FrenchAnalyzer, GermanAnalyzer, GreekAnalyzer, KeywordAnalyzer, PatternAnalyzer, PerFieldAnalyzerWrapper, RussianAnalyzer, SimpleAnalyzer, SnowballAnalyzer, StandardAnalyzer, St

25、opAnalyzer, ThaiAnalyzer, WhitespaceAnalyzer针对不同的语言和应用需要选择适合的针对不同的语言和应用需要选择适合的 AnalyzerAnalyzer。Analyzer Analyzer 把分词后的内容交给把分词后的内容交给 IndexWriter IndexWriter 来建立索引。来建立索引。 Documentorg.apache.lucene.document.Documentorg.apache.lucene.document.DocumentDocumentDocument文档类似数据库中的一条记录,可以由好几个字文档类似数据库中的一条记录,可

26、以由好几个字段(段(FieldField)组成,并且字段可以套用不同的类型。)组成,并且字段可以套用不同的类型。一个一个FieldField代表与这个文档相关的元数据。元数据如作者、代表与这个文档相关的元数据。元数据如作者、标题、主题、修改日期等等,分别做为文档的字段索引和标题、主题、修改日期等等,分别做为文档的字段索引和存储。存储。 DocumentDocument的方法:的方法: void add(Fieldablefield)添加一个字段(Field)到Document中 String get(String name)从文档中获得一个字段对应的文本doc.add(newField(pat

27、h,f.getPath(),Field.Store.YES,Field.Index.UN_TOKENIZED);Fieldorg.apache.lucene.document.Fieldorg.apache.lucene.document.FieldField Field 对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个容可以用两个 Field Field 对象分别描述。对象分别描述。 F i e l d ( S t r i n g n a m e , b y t e v a l u e , F i e l

28、 d . S t o r e s t o r e ) Create a stored field with binary value. Field(Stringname, Readerreader) Create a tokenized and indexed field that is not stored. F i e l d ( S t r i n g n a m e , R e a d e r r e a d e r , F i e l d . T e r m V e c t o r t e r m V e c t o r ) Create a tokenized and indexe

29、d field that is not stored, optionally with storing term vectors. Field(Stringname, Stringvalue, Field.Storestore, Field.Indexindex) Create a field by specifying its name, value and how it will be saved in the index. Field(Stringname, Stringvalue, Field.Storestore, Field.Indexindex, Field.TermVector

30、termVector) Create a field by specifying its name, value and how it will be saved in the index. F i e l d ( S t r i n g n a m e , T o k e n S t r e a m t o k e n S t r e a m ) Create a tokenized and indexed field that is not stored. Field(Stringname, TokenStreamtokenStream, Field.TermVectortermVecto

31、r) Create a tokenized and indexed field that is not stored, optionally with storing term vectors.静态内部类Field.IndexField.Index 表示表示FieldField的索引方式的索引方式 NO 表示该Field不需要索引,也就是用户不需要去查找该Field的值 NO_NORMS 表示对该Field进行索引,但是不使用Analyzer,同时禁止它参加评分,主要是为了减少内存的消耗 TOKENIZED 表示该Field先被分词再索引 UN_TOKENIZED 像链接地址URL、文件系统路

32、径信息、时间日期、人名、居民身份证、电话号码等等通常将被索引并且完整的存储在索引中,但一般不需要切分词Field.StoreField.Store 表示表示FieldField的存储方式的存储方式 COMPRESS压缩存储 NO 原文不存储在索引文件中,搜索结果命中后,再根据其他附加属性如文件的Path,数据库的主键等,重新连接打开原文,适合原文内容较大的情况。 YES索引文件本来只存储索引数据, 此设计将原文内容直接也存储在索引文件中,如文档的标题。 理解核心搜索类 只需要几个类来执行基本的搜索操作:只需要几个类来执行基本的搜索操作: public class IndexSearcher o

33、rg.apache.lucene.search.IndexSearcher extends Searcher public final class Term org.apache.lucene.index.Term public abstract class Query org.apache.lucene.search.Query public class TermQuery org.apache.lucene.search.TermQuery extends Query public final class Hits org.apache.lucene.search.Hits IndexSe

34、archerIndexSearcherIndexSearcher是用来在建立好的索引上进行搜索的是用来在建立好的索引上进行搜索的 它只能以只读的方式打开一个索引,所以可以有多个它只能以只读的方式打开一个索引,所以可以有多个IndexSearcherIndexSearcher的实例在一个索引上进行操作。的实例在一个索引上进行操作。它提供几个搜索方法,其中一些在抽象基类它提供几个搜索方法,其中一些在抽象基类SearcherSearcher中实中实现;现;Search方法返回值为返回值为HitsHits型的对象型的对象: : public final Hits search(Queryquery)

35、throws IOException Returns the documents matching query. public Hits search(Queryquery, Filterfilter) throws IOException Returns the documents matching query and filter. public Hits search(Queryquery, Sortsort) throws IOException Returns documents matching query sorted by sort. public Hits search(Qu

36、eryquery, Filterfilter, Sortsort) throws IOException Returns documents matching query and filter, sorted by sort.Term TermTerm是是搜索的基本单元搜索的基本单元。一个。一个TermTerm对象有两个对象有两个StringString类型类型的域组成:字段的名称和字段的值。的域组成:字段的名称和字段的值。在搜索时,你可能创建在搜索时,你可能创建TermTerm对象并和对象并和TermQueryTermQuery同时使用。同时使用。其中第一个参数代表了要在文档的哪一个其中第一

37、个参数代表了要在文档的哪一个FieldField上进行查找,上进行查找,第二个参数代表了要查询的关键词。第二个参数代表了要查询的关键词。 Query q = new TermQuery(new Term(“fieldName”, “queryWord ”); Hits hits = sercher.search(q); 这段代码使这段代码使LuceneLucene找出在找出在fieldNamefieldName字段中含有单词字段中含有单词queryWordqueryWord的所有文档。因为的所有文档。因为TermQueryTermQuery对象继承自它的抽对象继承自它的抽象父类象父类Query

38、Query,你可以在等式的左边用,你可以在等式的左边用QueryQuery类型。类型。 Query QueryQuery是一个抽象类,这个类的目的是把用户输入的查询字是一个抽象类,这个类的目的是把用户输入的查询字符串封装成符串封装成LuceneLucene能够识别的能够识别的QueryQuery。 LuceneLucene中包含一些中包含一些QueryQuery的具体子类。的具体子类。 Direct Known Subclasses: BooleanQuery, BoostingQuery, ConstantScoreQuery, ConstantScoreRangeQuery, Custom

39、ScoreQuery, DisjunctionMaxQuery, FilteredQuery, FuzzyLikeThisQuery, MatchAllDocsQuery, MoreLikeThisQuery, MultiPhraseQuery, MultiTermQuery, PhraseQuery, PrefixQuery, RangeQuery, SpanQuery, TermQuery, ValueSourceQueryHits HitsHits是用来保存搜索的结果的。是用来保存搜索的结果的。 基于性能考虑,基于性能考虑,HitsHits的实例并不从索引中加载所有匹配查的实例并不从索引

40、中加载所有匹配查询的所有文档,而是每次一小部分。询的所有文档,而是每次一小部分。 public final int length() public final Document doc(intn) public final float score(intn) public final int id(intn) public Iterator iterator() BooleanQuery布尔搜索BooleanQueryBooleanQuery是实际开发过程中经常使用的一种是实际开发过程中经常使用的一种QueryQuery。它其实是一个组合的它其实是一个组合的QueryQuery,在使用时可以把

41、各种,在使用时可以把各种QueryQuery对对象添加进去并标明它们之间的逻辑关系。象添加进去并标明它们之间的逻辑关系。BooleanQueryBooleanQuery是可以嵌套的是可以嵌套的(BooleanQuery(BooleanQuery是一个布尔子句是一个布尔子句的容器的容器) ) 一个BooleanQuery可以成为另一个BooleanQuery的条件子句。 布尔型Query的子句数目不能超过1024。 BooleanClause布尔搜索public void public void add(Queryadd(Queryquery, query, BooleanClause.Occu

42、rBooleanClause.Occuroccur)occur)BooleanClauseBooleanClause用于表示布尔查询子句关系的类,包括:用于表示布尔查询子句关系的类,包括: BooleanClause.Occur.MUST,BooleanClause.Occur.MUST_NOT,BooleanClause.Occur.SHOULD。有以下有以下6 6种组合:种组合: 1MUST和MUST:取得连个查询子句的交集。 2MUST和MUST_NOT:表示查询结果中不能包含MUST_NOT所对应得查询子句的检索结果。 3MUST_NOT和MUST_NOT:无意义,检索无结果。 4SH

43、OULD与MUST、SHOULD与MUST_NOT: SHOULD与MUST连用时,无意义,结果为MUST子句的检索结果。 SHOULD与MUST_NOT连用时, SHOULD功能同MUST,相当于MUST和MUST NOT的检索结果。 5SHOULD与SHOULD:表示“或”关系,最终检索结果为所有检索子句的并集。RangeQuery范围搜索public public RangeQuery(TermRangeQuery(TermlowerTerm, TermlowerTerm, TermupperTerm, upperTerm, booleanbooleaninclusive) inclus

44、ive) 布尔型的参数表示是否将2个临界值也加入到搜索中查找所有书号在查找所有书号在000001000001到到000005000005之间的图书之间的图书, ,并且不包括并且不包括000001000001和和000005000005 IndexSearcher searcher = new IndexSearcher(PATH); Term begin = new Term(booknumber,000001); Term end = new Term(booknumber,000005); RangeQuery query = new RangeQuery(begin,end,false)

45、; Hits hits = searcher.search(query);搜索类型PrefixQueryPrefixQuery 前缀搜索前缀搜索PhraseQueryPhraseQuery短语搜索短语搜索FuzzyQueryFuzzyQuery模糊搜索模糊搜索WildcardQueryWildcardQuery通配符搜索通配符搜索SpanQuerySpanQuery跨度搜索跨度搜索_RegexQuery_RegexQuery正则表达式搜索正则表达式搜索更新索引中的Document “如何才能更新索引中的文档?如何才能更新索引中的文档?”是一个在是一个在LuceneLucene用户邮用户邮件列表

46、中经常问的问题。件列表中经常问的问题。LuceneLucene并没有提供更新方法;并没有提供更新方法;DocumentDocument必须首先从索引中删除然后再重新添加它必须首先从索引中删除然后再重新添加它如果你需要删除和添加多个如果你需要删除和添加多个DocumentDocument,最好是进行批操作。,最好是进行批操作。按以下步骤:按以下步骤: 1. 打开IndexReader。 2. 删除所有你要删除的Document。 3. 关闭IndexReader。 4. 打开IndexWriter。 5. 添加你要添加的所有Document。 6. 关闭IndexWriter。 第三章:分析器A

47、nalyzer为什么要分词为什么要分词分词的种类分词的种类最大最大正向正向匹配法匹配法中文分词的挑战中文分词的挑战常用的中文分词器常用的中文分词器为什么要分词?词是最小的能够独立活动的有意义的语言成分,英文单词之间是以空格作为自词是最小的能够独立活动的有意义的语言成分,英文单词之间是以空格作为自然分界符的,而汉语是以字为基本的书写单位,词语之间没有明显的区分标记,然分界符的,而汉语是以字为基本的书写单位,词语之间没有明显的区分标记,因此,因此,中文词语分析是中文信息处理的基础与关键中文词语分析是中文信息处理的基础与关键。如果不使用中文分词,可以采用单个汉字索引方式如果不使用中文分词,可以采用单

48、个汉字索引方式。例如,。例如, 雅虎雅虎 ,先索引,先索引 雅雅 字,然后再索引字,然后再索引 虎虎 字。同样,对于一篇文章,先把所有的汉字都单独索字。同样,对于一篇文章,先把所有的汉字都单独索引一次,并记录他们的位置。搜索过程中,也是先找引一次,并记录他们的位置。搜索过程中,也是先找 雅雅 字的所有文档,再找字的所有文档,再找 虎虎 字的所有文档,然后做交叉字的所有文档,然后做交叉 与与 运算,即包含这两个字,而且位置连续的运算,即包含这两个字,而且位置连续的文档才会做为符合要求的结果。这种方式是最基本的索引方式,现在有些小引文档才会做为符合要求的结果。这种方式是最基本的索引方式,现在有些小

49、引擎中还在使用。但这里存在一个很有挑战性的问题:总共的常用汉字才擎中还在使用。但这里存在一个很有挑战性的问题:总共的常用汉字才30003000多多个,我们每次查询过程中,进行个,我们每次查询过程中,进行 与与 操作的计算量会相当大,对于大数据量搜操作的计算量会相当大,对于大数据量搜索引擎来说索引擎来说( (超过超过1010亿的文档亿的文档) ),每天上亿次查询,这样的索引结构,无疑是对,每天上亿次查询,这样的索引结构,无疑是对硬件和算法的极大挑战。硬件和算法的极大挑战。中文分词方法我们讨论的分词算法一般可分为三大类:我们讨论的分词算法一般可分为三大类:1.1.基于字典、词库匹配的分词方法;基于

50、字典、词库匹配的分词方法;2.2.基于词频度统计的分词方法基于词频度统计的分词方法; ;3.3.基于知识理解的分词方法。基于知识理解的分词方法。基于词典的分词方法也叫也叫“机械分词法机械分词法”,将分词的句子与词典中的词语进行匹配,如果匹配,将分词的句子与词典中的词语进行匹配,如果匹配成功,则将匹配的部分作为一个词,最后生成一个词语序列,根据分词的方向与成功,则将匹配的部分作为一个词,最后生成一个词语序列,根据分词的方向与优先长度不同可分为一下四种方法:优先长度不同可分为一下四种方法:1 1、正向匹配法、正向匹配法 例如例如:大学生活动中心大学生活动中心 2 2、逆向匹配法、逆向匹配法3 3、

51、最大匹配法、最大匹配法4 4、最小匹配法、最小匹配法最大正向匹配法 正向最大长度匹配切分过程表正向最大长度匹配切分过程表: : 最后分词结果为大学生/活动/中心。当然最大正向匹配也有弊端,例如:南京市长江大桥我们想要的匹配结果肯定是:南京市/长江/大桥但是按照最大正向匹配却是:南京市长/江/大桥中文分词的挑战现代分词技术主要的挑战是现代分词技术主要的挑战是: :新词发现新词发现u词典中没有的,但是结合紧密的字或词有可能组成一个新词。词典中没有的,但是结合紧密的字或词有可能组成一个新词。 比如:比如:“水立方水立方”如果不如果不在词典中,可能会切分成两个词在词典中,可能会切分成两个词“水水”和和

52、“立方立方”。如果在一篇文档中。如果在一篇文档中“水水”和和“立方立方”结合紧密,则结合紧密,则“水立方水立方”可能是一个新词。可以用信息熵来度量两个词的结合紧密程度。可能是一个新词。可以用信息熵来度量两个词的结合紧密程度。中文分词的挑战新词语有些具有普遍意义的构词规则,例如新词语有些具有普遍意义的构词规则,例如“模仿秀模仿秀”由由“动词动词+ +名词名词”组成。统计的方组成。统计的方法和规则的方法结合对每个文档中重复子串组成的候选新词打分,超过阈值的候选新词法和规则的方法结合对每个文档中重复子串组成的候选新词打分,超过阈值的候选新词选定为新词。此外,可以用选定为新词。此外,可以用WebWeb

53、信息挖掘的方法辅助发现新词:网页锚点上的文字可能是信息挖掘的方法辅助发现新词:网页锚点上的文字可能是新词,例如新词,例如“美甲美甲”。另外,可以考虑先对文档集合聚类,然后从聚合出来的相关文档。另外,可以考虑先对文档集合聚类,然后从聚合出来的相关文档中挖掘新词。中挖掘新词。还有一些还有一些新机构名、品牌名、专业名词、缩略语、网络新词、新机构名、品牌名、专业名词、缩略语、网络新词、人名人名等等常用的中文分词器单字分词单字分词二分法二分法 CJKAnalyzer词典分词词典分词 中科院ICTCLAS,C+开发(JNI) JE分词,由java写成 庖丁解牛分词包,适用于与Lucene整合。http:/ IKAnalyzer http:/ 盘古分词构建一个简单的WEB搜索程序有兴趣的同学可以自己开发一个简单的搜索程序有兴趣的同学可以自己开发一个简单的搜索程序大家一起相互交流大家一起相互交流thankyou

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!