从今天开始学习全文检索技术了.呵呵,换了新的老师.这个老师叫汤阳光.名字很帅气吧.还没有上课呢,就听佟刚老师说了,他的 Eclipse 的快捷键使用很快.写起代码很方便.果然一上课老师就先介绍了一下他经常使用的快捷键.
1. Eclipse 中实用快捷键
alt+ 内容提示 == 如:syso 按此快捷键之后生成 System.out.println();
Ctrl+Alt+↓ 复制当前行到下一行(复制增加)
Ctrl+Alt+↑ 复制当前行到上一行(复制增加) -- 经常会使用到的
ctrl+shift+o 批量导入需要的类、接口之类的,比较常用
ctrl+1 错误帮助,一般用此快捷键创建某个方法
Alt+← 前一个编辑的页面
Alt+→ 下一个编辑的页面(当然是针对上面那条来说了)
Ctrl+Shift+F 格式化当前代码,关于格式化的配置大家应该都知道在哪配吧
2.什么是信息检索,什么是全文检索?
信息检索就是从信息集合中找出与用户需求相关的信息。被检索的信息除了文本外,还有图像、音频、视频等多媒体信息,我们只关注文本的检索。把用户的查询请求和全文中的每一个词进行比较,不考虑查询请求与文本语义上的匹配,这叫做全文检索。在信息检索工具中,全文检索是最具通用性和实用性的。
在这里我们要特别注意两个地方,只关注文本,不考虑语义。
3.为什么我们不用 SQL 语句来实现功能呢?
数据库的搜索不能实现我们的全文检索的要求,主要是匹配效果:如搜索ant,在sql中使用like ‘%ant%’会搜索出planting,但他不应出现。查出的结果没有相关度排序,不知道有用的结果在哪一页。搜索速度太慢,达不到毫秒级的要求。其实在 Lucene 没有出现之前我们是使用在数据库中建一个 keyword 的表来实现这个功能的.不过使用起来和维护都很麻烦.
4.Lucene
Lucene是一个高性能、可伸缩的全文检索工具包。可以使用他为你的应用程序添加索引和搜索能力。Lucene的作者Doug Cutting是资深的全文检索专家。最初,Lucene以开源的形式出现在SourceForget上。2001年,Lucene加入了Apache旗下的Jakarta项目。2005年,Lucene正式脱离Jakarta成为Apache旗下的顶级项目。现在,Lucene的主页为:http://lucene.apache.org/。有很多应用程序使用Lucene来提供全文检索的功能,如我们经常使用的Eclipse的帮助子系统,就是使用Lucene实现的。(在第一次使用的时候,会有一个进度条,那是在创建索引)。
5.添加Lucene环境.
添加 jar包
lucene-core-2.4.0.jar(核心);
contrib/analyzers/lucene- analyzers-2.4.0.jar(分词器);
contrib/highlighter/lucene-highlighter- 2.4.0.jar(高亮器);
6.建立索引.
进行搜索前要建立索引.
file --> doc
Document doc = File2DocumentUtils.file2Document(filePath);
/建立索引
IndexWriter indexWriter = new IndexWriter(indexPath, analyzer, true, MaxFieldLength.LIMITED);
indexWriter.addDocument(doc);
indexWriter.close();
7.简单的搜索:
String queryString = "document";
1,把要搜索的文本解析为 Query
String[] fields = { "name", "content" };
QueryParser queryParser = new MultiFieldQueryParser(fields, analyzer);
Query query = queryParser.parse(queryString);
2,进行查询
IndexSearcher indexSearcher = new IndexSearcher(indexPath);
Filter filter = null;
TopDocs topDocs = indexSearcher.search(query, filter, 10000);
System.out.println(" 总共有【"+topDocs.totalHits+"】条匹配结果");
3,打印结果
for(ScoreDoc scoreDoc : topDocs.scoreDocs){
int docSn = scoreDoc.doc; // 文档内部编号
Document doc = indexSearcher.doc(docSn); // 根据编号取出相应的文档
File2DocumentUtils.printDocumentInfo(doc); // 打印出文档信息
}
8.在使用 Lucene 的 API 中,会遇到这样一个问题.
在对属性值进行大小比较时(通常是使用范围查询,比较数字类型的时候),是按照字符串的比较规则,因为他们都是转成字符串后存储的。这样就会出现问题,如 “20”是大于“100”的(根据字符串的比较规则)。解决的方法是:让数字转成的字符串具有相同的位数,如位数不足,就在前面补相应数量个“0”。数字到符串、字符串到数字的转换可以使用Lucene提供的工具类NumberTools完成。对于日期与字符串的双向转换,则可以使用Lucene提供的 DateTools完成。
9.分词器 Analyzer
分词器,对文本资源进行切分,将文本按规则切分为一个个可以进行索引的最小单位(关键词).建立索引和进行搜索时都要用到分词器。为了保证能正确的搜索到结果,在建立索引与进行搜索时使用的分词器应是同一个。
我们在使用分词器的时候要注意,不同语言的分词器是不一样的.
英文分词的流程:
如用StandardAnalyzer对“IndexWriter addDocument's a javadoc.txt”进行分词:
切分词“IndexWriter”、“ addDocument's”、“a”、“ javadoc.txt”
排除停用词“IndexWriter”、“ addDocument's”、“ javadoc.txt”
形态还原“IndexWriter”、“ addDocument”、“ javadoc.txt”
转为小写“IndexWriter”、“ addDocument”、“ javadoc.txt”
中文分词的流程:
对于中文分词,通常有三种方式:单字分词、二分法分词、词典分词。
单字分词:就是按照中文一个字一个字地进行分词。如:“我们是中国人”,
效果:“我”、“们”、“是”、“中”、“国”、“人”。(StandardAnalyzer就是这样)。
二分法分词:按两个字进行切分。如:“我们是中国人”,效果:“我们”、“们是”、“是中”、“中国”、“国人”。(CJKAnalyzer就是这样)。
词典分词:按某种算法构造词,然后去匹配已建好的词库集合,如果匹配到就切分出来成为词语。通常词库分词被认为是最理想的中文分词算法。如:“我们是中国人”,效果为:“我们”、“中国人”。(使用极易分词的MMAnalyzer)。可以使用“极易分词”,或者是“庖丁分词”分词器。
总结:
上面涉及到了一个概念,停用词.那么停用词是什么呢.
有些词在文本中出现的频率非常高,而且对文本所携带的信息基本不产生影响,例如英文的“a、an、the、of”,或中文的 “的、了、着”,以及各种标点符号等,这样的词称为停用词(stop word)。文本经过分词之后,停用词通常被过滤掉,不会被进行索引。在检索的时候,用户的查询中如果含有停用词,检索系统也会将其过滤掉(因为用户输入的查询字符串也要进行分词处理)。排除停用词可以加快建立索引的速度,还可以减小索引文件的大小。
10.高亮器
可以截取一段文本(生成摘要),并且让关键字高亮显示(通过指定前缀与后缀实现,因为是在网页中显示,指定 “<font color=’red’>”,“</font>”,就会在网页中显示为红色)。
今天对全文检索和 Lucene的学习,有了很大的收获.不过一下,学习了很多的API,一时还不能全部记住.下课的时候,和老师和同学讨论了一下这个问题.老师给我们的思路是:传智播客的教学信息量是很大的.大多数人都不会马上记住和全部理解,所以要在课后多多练习.并复习视频,及时做总结.这样的学习效果才能好,在课上要跟上老师的思路,理解其中的思想才是最最关键的.
luncene 传智播客--luncene(汤阳光)
最新推荐文章于 2021-04-13 18:20:04 发布