Lucene&Solr框架之第一篇小小一

但是如果老师不告诉你你坑爹的“坑”字在哪一页呢?也没有教你如何查字典呢?你只能从第一页的第一个字逐个的扫描下去,那样你真的是被坑了。查找的过程会相当的慢,甚至会让你崩溃,所以这种坑爹的事情我们不能去做。我们要重新思考此时的查询办法。

思考一下新华字典是怎么解决汉字的快速查找的?从一堆没有结构的内容中提取出来文字的位置信息(页码)、文字写法(文字本身)、汉语拼音,然后将它们重新整理、排序、归纳,最终形成一张结构化的表,我们叫做汉语拼音音节索引表。汉语拼音索引中记录了“坑”字在哪一页的信息,只要你知道“坑”字的汉语拼音,就可以快速的查找到“坑”字在哪,这样答案就出来了。下图是汉语拼音音节索引表:

从新华字典的例子总结一下,如何从一堆没有规律没有结构的信息中快速的查找我们需要的信息?最有效的方法就是先将信息重新组织(提取、整理、排序、归纳),形成新的集合(即一个更方便更高效查找的集合),然后查询这个结构化的集合,从中找出你要找的信息在原文中的位置。简单归纳成:非结构化结构化保存结构化查找结构化得到在非结构化中的定位

·基本的数据查询方案在面对查询量大的应用时会对数据库造成极大的压力,而且查询效率会很低。·改进后的数据查询方案将读写进行了分离,将查询量大的应用的查询请求分发给了索引库,查询直接走索引库,不走数据库,这样就有效的降低了数据库的压力,同时索引库查询的高效特性也能够保证查询效率。2.6.全文检索的应用场景全文检索应用最多的就是开发站内搜索服务。尤其是对于电商系统,大数据量的搜索都是使用的站内搜索服务。还有专业的搜索引擎中也有全文检索技术的使用,比如百度、Google等,但专业的搜索引擎不只使用这一种搜索技术。3.Lucene实现全文检索的流程3.1.创建索引和查询索引流程

说明:1.绿色表示创建索引过程,包括:采集数据构建文档对象分析文档对象创建索引(保存到索引库)

2.红色表示查询索引过程,包括:入口提交查询请求(查询关键字)创建查询对象执行查询(从索引库搜索)渲染结果显示查询结果3.2.索引流程用户将想要搜索的原始数据创建索引,索引内容存储在索引库(index)中。创建索引时不会改变原始文档的任何内容,只是将有用信息的拷贝重新组织成索引。假设有如下两个原始文档:【students.txt】:Studentsshouldbeallowedtogooutwiththeirfriends,butnotallowedtodrinkbeer.【myfriends.txt】:MyfriendJerrywenttoschooltoseehisstudentsbutfoundthemdrunkwhichisnotallowed.

3.2.1.采集数据

(手动编程)从互联网上、数据库、文件系统中等获取需要搜索的原始信息,这个过程就是信息采集,信息采集的目的是为了对原始内容进行索引。如何采集数据?1、互联网上的网页:可以使用工具将网页抓取到本地生成html文件。2、数据库中的数据:可以直接连接数据库用SQL查询数据。3、文件系统中的文件:可以通过I/O操作读取文件的内容。

上图是将磁盘上的一个文件采集出来的数据放入一个Document对象。Document对象中包括四个Field(file_name、file_path、file_size、file_content)3.2.3.分析文档对象(重点)(Lucene自动完成)分析文档主要是对文档的Field域进行分析,目的是为了创建索引做好准备。分析的过程是将域(Field)的内容转换成最基本的索引单元——项(Term)的过程。

3.2.3.1.分词组件(Tokenizer)分词组件(Tokenizer)会做以下几件事情(这个过程称为:Tokenize):1.分词器将Field域内容分成一个一个单独的单词2.标点符号过滤器去除内容中的标点符号3.停用词过滤器去除停用词(stopword)什么是停用词?所谓停词(Stopword)就是一种语言中没有具体含义的词,因而大多数情况下不会作为搜索的关键词,这样一来创建索引时能减少索引的大小。英语中停词(Stopword)如:”the”、”a”、”this”,中文有:”的,得”等。不同语种的分词组件(Tokenizer),都有自己的停词(stopword)集合。

综上所述,分析文档的最终产物是Term,Term是创建索引的最小单元,也是搜索索引时的最小单元。3.2.4.创建索引(Lucene自动完成)

3.2.4.1.创建字典表利用得到的词项(Term)创建一个字典表,一列是Term词项,一列是文档ID(DocId)字典表如下:TermDocIdstudent1allow1go1their1friend1allow1drink1beer1my2friend2jerry2go2school2see2his2student2find2them2drink2allow2

3.2.4.2.对字典表按字母顺序排序对字典表按字母顺序排序:排序结果如下:TermDocIdallow1allow1allow2beer1drink1drink2find2friend1friend2go1go2his2jerry2my2school2see2student1student2their1them2

3.2.4.3.合并相同词项,归纳文档倒排链表创建好的Term词项实际是包含两部分信息:一是Term出自哪个域,二是Term的内容。合并相同的词项(Term)成为文档倒排(PostingList)链表。●合并规则:●在比较Term是否相同时,不考虑是否在同一个Document对象中,合并时暂时忽略它。●不同的域(Field)中拆分出来的相同的单词是不同的Term,不能合并。例如:文件名中包含apache和文件内容中包含的apache是不同的Term。●同名域(Field)的相同单词是相同的Term,可以合并。例如:两个文档中都有【文件名】Field域中都含有Java,这两个Java就是一个Term(域和单词都相同)

例子是以两个文档的【content】域作为演示的例子,因此只要单词相同就是相同的Term,就可以合并。合并结果如下:合并的同时要记录这个Term来自于哪个文档以及出现的次数。

●DocumentFrequency(DF):文档频次,表示多少文档出现过此词(Term)●Frequency(TF):词频,表示某个文档中该词(Term)出现过几次例如:对词项(Term)“allow”来讲,总共有两篇(DF)文档包含此Term,Term后面的文档链表总共有两个,第一个表示包含“allow”的第一篇文档,即DocId=1的文档,此文档中“allow”出现了2次(TF),第二个表示包含“allow”的第二个文档,即DocId=2的文档,此文档中,”allow”出现了1次(TF)。索引表+文档倒排链表+文档对象集合,共同组成了索引库●索引表是保存索引词项的●文档倒排链表是保存包含词项的文档ID的●文档对象集合是保存文档具体内容的3.2.5.索引流程总结

3.3.查询索引查询索引就是搜索的过程。搜索就是用户输入关键字,从索引(index)中进行搜索的过程。根据关键字搜索索引,根据索引找到对应的文档,从而找到要搜索的内容。3.3.1.用户用户可以是自然人,也可以是远程调用的程序。3.3.2.用户搜索界面(手动编程)搜索界面用于提交用户搜索关键字的,也相当于采集数据的作用。比如:

对条件进行解析并执行查询:(三步)●第一步:对查询语句进行词法分析、语法分析及语言处理1.词法分析如上述例子中,经过词法分析,得到单词有台灯,LED,调光开关,关键字有AND,NOT。注意:关键字必须大写,否则就作为普通单词处理。关键字有AND、OR、NOT。

2.语法分析如果发现查询语句不满足语法规则,则会报错。如product_keywords:台灯NOTAND调光开关,则会出错。如果查询语句满足语法规则,就会形成语法树如下:3.语言处理如LED变成led等。经过第三步,我们得到一棵经过语言处理的语法树。

●第二步:搜索索引,得到符合语法树的文档1.首先,在反向索引表中,分别找出包含lucene,learn,hadoop的文档链表。

2.其次,对包含lucene,learn的链表进行合并操作,得到既包含lucene又包含learn的文档链表。

3.然后,将此链表与hadoop的文档链表进行差操作,去除包含hadoop的文档,从而得到既包含lucene又包含learn而且不包含hadoop的文档链表。

4.此文档链表就是我们要找的文档。

3.3.6.渲染结果以一个友好的界面将查询结果展示给用户,用户根据搜索结果找自己想要的信息,为了帮助用户很快找到自己的结果,提供了很多展示的效果,比如搜索结果中将关键字高亮显示,百度提供的快照等。

Lucene基本开发jar包:lucene-core-4.10.3.jarlucene-analyzers-common-4.10.3.jarlucene-queryparser-4.10.3.jar

1)lucene-core-4.10.3.jar的位置:这是Lucene的核心jar包

2)lucene-analyzers-common-4.10.3.jar的位置:这是Lucene的分析器的核心jar包

3)lucene-queryparser-4.10.3.jar的位置:这是Lucene的查询解析器jar包其它:用于处理文件内容的工具包commons-io-2.4.jar

4.3.创建java工程创建一个java工程,编码格式utf-8,并导入jar包并导入Junit测试的jar。5.入门程序5.1.需求实现一个文件的搜索功能,通过关键字搜索文件,凡是文件名或文件内容包括关键字的文件都需要找出来。还可以根据中文词语进行查询,并且需要支持多个条件查询。本案例中的原始内容就是磁盘上的文件,如下图:

这里我们要搜索的文档是磁盘上的文本文件,我们要把凡是文件名或文件内容中包括关键字的文件都要找出来,所以这里要对文件名和文件内容创建索引。

本案例我们要获取磁盘上文件的内容,可以通过文件流来读取文本文件的内容,对于pdf、doc、xls等文件可通过第三方提供的解析工具读取文件内容,比如ApachePOI读取doc和xls的文件内容。

publicclassCreateIndexTest{/***创建IndexWriter(创建索引准备工作)*/privateIndexWritercreateIndexWriter(StringindexRepositoryPath)throwsException{//创建Directory对象Directorydir=FSDirectory.open(newFile(indexRepositoryPath));//索引库还可以存放到内存中//Directorydirectory=newRAMDirectory();//创建一个标准分析器Analyzeranalyzer=newStandardAnalyzer();//创建IndexWriterConfig对象//参数1:Lucene的版本信息,可以选择对应的Lucene版本也可以使用LATEST//参数2:分析器对象IndexWriterConfigconfig=newIndexWriterConfig(Version.LATEST,analyzer);//创建IndexWriter对象returnnewIndexWriter(dir,config);}

5.2.3.使用Luke工具查看索引文件使用luke工具。Luke是一个便于使用Lucene开发和诊断的第三方工具,它可以访问现有利用Lucene创建的索引,并允许显示和修改。1.启动工具:直接双击【start.bat】或者在控制台输入【java-jarlukeall-4.10.3.jar】

2.选择索引库位置

3.索引域的展示效果:

4.文档域的展示效果:

5.3.3.TopDocsLucene搜索结果可通过TopDocs遍历,TopDocs类提供了少量的属性,如下:

6.3.中文分析器对于分词来说,不同的语言,分词规则是不同的,比如英语每个单词都是用空格分隔,所以拆分词的规则比较简单,我们可以简单以空格判断某个字符串是否为一个单词,比如IloveChina,love和China很容易被程序区分开来。汉字就不同了,中文是以字为单位的,字组成词,字和词再组成句子。所以它的词必须根据语义分析后才能正确的拆分,所以拆分词的规则会很复杂。比如:“我爱中国”,电脑不知道“中国”是一个词语还是“爱中”是一个词语。把中文的句子切分成有意义的词就是中文分词,也称切词。“我爱中国”,正确的分词结果是:我、爱、中国。6.3.1.Lucene自带中文分析器StandardAnalyzer:单字分词:就是按照中文一个字一个字地进行分词。如:“我爱中国”,效果:“我”、“爱”、“中”、“国”。CJKAnalyzer二分法分词:按两个字进行切分。如:“我是中国人”,效果:“我是”、“是中”、“中国”“国人”。

使用方法:第一步:把jar包添加到工程中第二步:把配置文件和扩展词典和停用词词典添加到classpath下

注意:mydict.dic和ext_stopword.dic文件的格式为UTF-8,注意是无BOM的UTF-8编码。

使用EditPlus.exe保存为无BOM的UTF-8编码格式,如下图:

6.4.1.添加jar包在【资料\jar\IK】下找到IKAnalyzer的jar包

6.4.2.修改代码IKAnalyzer继承Lucene的Analyzer抽象类,使用IKAnalyzer和Lucene自带的分析器方法一样,将创建索引的测试代码中的【StandardAnalyzer】改为【IKAnalyzer】测试中文分词效果。可以和之前使用StandardAnalyzer分析器创建的索引可以对比一下:StandardAnalyzer分析得出的索引结果:

IKAnalyzer分析得出的索引结果:

从结果看出IKAnalyzer能更好的从语义上识别中文,并做出比较正确的切分词。6.4.3.扩展词库的使用IKAnalyzer允许用户扩展自己的中文词库,包括扩展词库和停用词库。扩展词库:是把一些特殊的专有名词加进来,这样分词的时候就会把专有名词当成一个整体,不会被切分。停用词库:是把一些想过滤掉的词加进来,这样分词后就会被过滤器过滤掉,不作为索引的语汇单元。6.4.3.1.扩展词库文件与停用词库文件下载下来的IK压缩包中可能有停用词库,但没有扩展词库,但可以手动创建,但要注意:在创建词库时,不要用windows自带的记事本保存词库文件,因为windows默认格式是含有bom文件头的,这是个不可见文件标识符号,IK识别的时候会出错,因为非windows系统都是不带bom文件头的。

扩展词库【ext.dic】编程思想传智播客

6.4.3.3.测试为了便于测试结果的确认,在数据库book表中把每一条记录的description中都加入:【《计算机科学丛书:Java编程思想(第4版)》【传智播客】】这一段话,这样可以增加【编程思想】和【传智播客】的出现频率,搜索排名会靠前。1.不加扩展词库和停用词库时创建索引的结果:停用词没有被过滤掉:and,的,the等都被加进了索引库扩展词【编程思想】【传值播客】被分开了

2.添加停用词库后重新创建索引(将原来的索引文件删除,注意:要先关闭Luke)

如果加入log4j,再次运行的log:

已经看不到被停用的单词了:

3.添加扩展词库后重新创建索引(将原来的索引文件删除,注意:要先关闭Luke)

再次运行的log:

已经看到扩展词没有被切分:【传值播客】是纯粹的专有名词,所以完全的被保留,没有切分【编程思想】并不是纯粹的专有名词,在IK的内部的中文分词器中仍然会识别【编程】和【思想】,然后你又追加了【编程思想】,所以最终是三个词【编程】【思想】【编程思想】

6.5.分析器Analyzer使用时机6.5.1.索引时使用的Analyzer创建索引时对文档对象的内容进行分析是一个必要的过程,大部分文档内容都是需要被分析的,但也有一些特殊的Field域的内容是不用分析,可以直接作为Term创建索引。对于一些Field可以不用分析:1、不作为查询条件的内容,比如文件路径2、不是匹配内容中的词而匹配Field的整体内容,比如订单号、身份证号等。

6.5.2.搜索时使用Analyzer用户输入的查询内容也需要进行分析,这个过程和创建索引时的分析是一样的,因此他们必须使用一致的分析器对象,否则会出现双方分析出来的Term对应不上,这样就无法进行查询了。注意:搜索使用的分析器要和索引使用的分析器一致。和索引时一样,查询是也存在一些特殊的查询是不需要分析的,比如根据订单号、身份证号查询等。

THE END
1.62篇英语作文高分范文背诵(二)+中英文本!内容提示: 62 篇英语作文高分范文背诵(二)+中英文本!第一篇:电子词典的优缺点One Major Advantage of Electronic DictionariesElectronic dictionaries are becoming more and more popular amongstudents nowadays. As a result, they may eventually render printeddictionaries obsolete!A nd therefore,I would like tohttps://www.doc88.com/p-70780475833434.html
2.2025年初中二年级英语作文常用词(365篇)2025年初中二年级英语作文常用词(365篇) 每周学一页(学习卡) 一、惯用词 Paper 翻译:纸 Different 翻译:不同的 Rude 翻译:粗鲁的 Advantage 翻译:优势 Fortune 翻译:财富 Angry 翻译:生气的 Warthog 翻译:疣猪 Skunk 翻译:臭鼬 Bill 翻译:账单 Differ 翻译:不同 Dry 翻译:干燥的 Copy 翻译:复制 Sheep 翻译:https://wenku.baidu.com/view/de35fdf3cb50ad02de80d4d8d15abe23492f031f.html
3.全球化背景下英语写作的重要性与提升技巧english写作水平英语在当今全球化的时代,英语已成为国际交流的主要语言。无论是在商业、科技、文化还是教育领域,英语的使用频率都在不断上升。因此,掌握英语写作技能不仅是个人发展的需要,更是适应社会变化的必然要求。 英语写作的历史背景 Historical Background of English Writing 英语写作的历史可以追溯到中世纪。最初,英语主要是口头语言https://m.163.com/dy/article/JJHDEJTH0556A727.html
4.高中英语学习方法(精选15篇)例如,一些体现英语的高级句型和高级短语,平时积累的一些地道的优美的英语句子……为了使我们的准备有针对性,可以对历年的真题进行分析,找出经常考的一些话题,这样就可以有针对性地进行准备。当然要想写好作文,光靠这些应试技巧是不够的,最重要的还是平时的积累,对英语语感的培养。 https://www.yjbys.com/xuexi/fangfa/3397798.html
5.《现代汉语词典》每一次增补本都会收录一些新的词语,这体现了语汇刷刷题APP(shuashuati.com)是专业的大学生刷题搜题拍题答疑工具,刷刷题提供《现代汉语词典》每一次增补本都会收录一些新的词语,这体现了语汇的()A.任意性B.活跃性C.普遍性D.民族性的答案解析,刷刷题为用户提供专业的考试题库练习。一分钟将考试题Word文档/Excel文档/PDhttps://www.shuashuati.com/ti/8e5a27eb252042d189306769c361910e.html?fm=bd74bbe11a4886a51c8ce5b8b3382243d0
6.语汇新颖性的英文语汇新颖性翻译语汇新颖性英语怎么说海词词典,最权威的学习词典,专业出版语汇新颖性的英文,语汇新颖性翻译,语汇新颖性英语怎么说等详细讲解。海词词典:学习变容易,记忆很深刻。http://dict.cn/%E8%AF%AD%E6%B1%87%E6%96%B0%E9%A2%96%E6%80%A7
7.《汉语新词语》词典11篇(全文)《汉语新词语》词典 第1篇 一、新时代产生新词语 新词语, 顾名思义, 就是新产生的词语。新词语的产生与其他新生事物一样是随着社会生活的变化和时代的不断发展而产生的, 是各种语言都存在的普遍现象。新词语的产生是以适应人们交际需要为前提, 内容涉及社会生活的各个领域, 是现代汉语词汇体系中的一个重要组成https://www.99xueshu.com/w/ikeyqqpdp9ds.html
8.使用阿里云试用Elasticsearch学习:3.4处理人类语言——将单词还原为Hunspell 词典格式 略 选择一个词干提取器 在文档 stemmer token filter 里面列出了一些针对语言的若干词干提取器。 就英语来说我们有如下提取器: english porter_stem? 语汇单元过滤器(token filter)。 light_english kstem 语汇单元过滤器(token filter)。 https://blog.csdn.net/weixin_49131823/article/details/137441854
9.印欧语词汇比较词典(豆瓣)巴克所着的《印欧语语汇比较词典》不仅是他最集中心血,也是受众面最广的著作,此书正文厚达1515页,按照语义分类,可以让读者快速获悉同源词在各种印欧语中的分布情况,提供了关于原始印欧人的环境、文化和制度的重要信息。 字典主体分为二十二个章节,分别是:1.物质世界;2.人类;3.动物;4.身体部分;5.食物和饮料;6.https://book.douban.com/subject/27604982/
10.新满汉大词典(第2版)(精)以《清文鉴》为蓝本,满汉双语对照,满文使用拉丁字母转写字符。 释义详尽,详解专门用语和满语特殊语汇,标注汉语、梵文借词,疏通原义。 例证丰富,征引满文文献达数十种。 提供拉丁字母音序、满文字母音序、汉-满、英-满等多种检索方式。 新满汉大词典(第2版)(精) 编者:胡增益详情https://www.yuntaigo.com/book.action?recordid=bGJtaG1sbmM5Nzg3MTAwMTc0NjAy
11.noveltyofvocabulary,音标,读音,翻译,英文例句,英语词典语汇新颖性2) novelty [英]['n?vlti] [美]['nɑvl?t?] 新颖性 1. Research on the System of Novelty of Invention and Utility Model; 发明与实用新型专利新颖性制度研究 2. The aesthetic characteristics of architecture imagery are summarized fromrour aspects,they are the entirety,the http://www.dictall.com/indu/259/2584533F330.htm
12.有道词典词汇意义通常是指词典列出的各词条的意义,是词汇单独的、孤立的意义,也是词汇最基本的意义。 Lexical meaning usually refers to the separate and isolated meaning of words listed in dictionaries, which is the most basic meaning. 24. 39kb 民俗语汇是词汇研究的一个新视角,而对其研究尚不充分,本文的色彩https://m.youdao.com/singledict?q=%E6%98%AF%E8%AF%8D%E6%B1%87&dict=blng_sents&more=true
13.语汇的意思语汇是什么意思语汇的近义词反义词读音沪江在线词典网为您精选语汇的意思及读音、语汇是什么意思、反义词、近义词等信息,由lenann于2011年4月3日添加。https://www.hujiang.com/cidian/yuhui_26768/
14.网易有道词典单词本下载网易有道词典单词本app安卓最新下载网易有道词典单词本特点 提供数以万计的常见中英当地语汇,外加智能化键入提醒,有道词典集成化中、英、日、韩、法多语种技术专业词典,转换语言表达自然环境。 网易有道词典单词本亮点 增加的详解字典和百度百科功能,给予了一站式专业知识查询平台; 可以合理协助用户了解记忆力新英语单词; 而单词本功能也是让用户能够随时https://app.ali213.net/android/338113.html
15.新版汉语词典怎么样新版汉语词典多少钱新华词典(第4版) 教材教辅中小学1-6年级语文课外阅读作文新华字典成语故事牛津高阶古汉语常用字古代汉语英语学习常备工具书暂无报价 评价人数2万+好评度99% y***1 俺的评价就是最好的免费推广!商务馆的字典词典买了好多好多,光新华字典就入手了11版的单色、双色及大字版,12版的单色、双色及大字版,商务馆120https://club.jd.com/koubei/e696b0e78988e6b189e8afade8af8de585b8.html
16.《新华歇后语词典》中歇后语语义分析.pdf《新华歇后语词典》中歇后语语义分析.pdf,ABSTRACT totheHan 1t isan cIass nationali吼and sayingunique The铆o.panallegorical masses· Han is“the cultureofme nat.onality,which the and renectsthinking lt 18 the VerbaIcommunicatlon, and Inherited throughpehttps://max.book118.com/html/2015/0816/23492363.shtm
17.圣经人名词典汉英对照免费阅读(圣经人名词典《圣经人名词典-汉英对照小说》文笔俱佳、情节跌宕起伏、扣人心弦,深深地打动着每一位网友。《圣经人名词典-汉英对照大结局版》讲述的是本书与《圣经地名词典》《圣经语汇词典》为一套系,构成了《圣经》重要的辅助读本丛书。本书是根据《圣经百科全书》和《新圣经词典》编译的。上述两书的主要根据是圣经。本书也是http://fxcoo.com/n126118
18.查漏补缺!四六级高分作文模板常用句式和范文汇总PART 01英语四级作文模板 01现象阐释型 这类作文多为提纲式作文或图表式作文。这类命题要求考生对某一社会现象进行解释,分析产生该现象的原因并加以评论。 写作模式: 第一段描述现象; 第二段解释这种现象产生或存在的原因; 第三段提出解决问题的建议https://mp.weixin.qq.com/s?__biz=MzI1NDk4MjYyNg==&mid=2247644760&idx=1&sn=164716b963cdfbfc5f4d790ec777f180&chksm=ea3016d5dd479fc3f73cc9ca3bd769db9c692adc239c7984efab0e9acdd7da34290048bab7b3&scene=27