信息检索论文基于lucene的实验大学论文Word文件下载.docx
- 文档编号:17506425
- 上传时间:2022-12-06
- 格式:DOCX
- 页数:10
- 大小:121.49KB
信息检索论文基于lucene的实验大学论文Word文件下载.docx
《信息检索论文基于lucene的实验大学论文Word文件下载.docx》由会员分享,可在线阅读,更多相关《信息检索论文基于lucene的实验大学论文Word文件下载.docx(10页珍藏版)》请在冰豆网上搜索。
去除stopword(可选)。
将源中需要的信息加入Document的各个Field中,并把需要索引的Field索引起来,把需要存储的Field存储起来。
将索引写入存储器,存储器可以是内存或磁盘。
读出流程
用户提供搜索关键词,经过analyzer处理。
对处理后的关键词搜索索引找出对应的Document。
用户根据需要从找到的Document中提取需要的Field。
我们可以看到,Lucene的使用主要体现在两个步骤:
1创建索引,通过IndexWriter对不同的文件进行索引的创建,并将其保存在索引相关文件存储的位置中。
2通过索引查询关键字文档
一些需要用到的概念
analyzer
Analyzer
是分析器,它的作用是把一个字符串按某种规则划分成一个个词语,并去除其中的无效词语,这里说的无效词语是指英文中的“of”、
“the”,中文中的
“的”、“地”等词语,这些词语在文章中大量出现,但是本身不包含什么关键信息,去掉有利于缩小索引文件、提高效率、提高命中率。
分词的规则千变万化,但目的只有一个:
按语义划分。
这点在英文中比较容易实现,因为英文本身就是以单词为单位的,已经用空格分开;
而中文则必须以某种方法将连成一片的句子划分成一个个词语。
具体划分方法下面再详细介绍,这里只需了解分析器的概念即可。
document
用户提供的源是一条条记录,它们可以是文本文件、字符串或者数据库表的一条记录等等。
一条记录经过索引之后,就是以一个Document的形式存储在索引文件中的。
用户进行搜索,也是以Document列表的形式返回。
field
一个Document可以包含多个信息域,例如一篇文章可以包含“标题”、“正文”、“最后修改时间”等信息域,这些信息域就是通过Field在Document中存储的。
Field有两个属性可选:
存储和索引。
通过存储属性你可以控制是否对这个Field进行存储;
通过索引属性你可以控制是否对该Field进行索引。
这看起来似乎有些废话,事实上对这两个属性的正确组合很重要,下面举例说明:
还
是以刚才的文章为例子,我们需要对标题和正文进行全文搜索,所以我们要把索引属性设置为真,同时我们希望能直接从搜索结果中提取文章标题,所以我们把标题
域的存储属性设置为真,但是由于正文域太大了,我们为了缩小索引文件大小,将正文域的存储属性设置为假,当需要时再直接读取文件;
我们只是希望能从搜索解
果中提取最后修改时间,不需要对它进行搜索,所以我们把最后修改时间域的存储属性设置为真,索引属性设置为假。
上面的三个域涵盖了两个属性的三种组合,还
有一种全为假的没有用到,事实上Field不允许你那么设置,因为既不存储又不索引的域是没有意义的。
term
term是搜索的最小单位,它表示文档的一个词语,term由两部分组成:
它表示的词语和这个词语所出现的field。
tocken
tocken是term的一次出现,它包含trem文本和相应的起止偏移,以及一个类型字符串。
一句话中可以出现多次相同的词语,它们都用同一个term表示,但是用不同的tocken,每个tocken标记该词语出现的地方。
Lucene所需要用到的外部工具
八爪鱼采集器
八爪鱼数据采集系统以完全自主研发的分布式云计算平台为核心,可以在很短的时间内,轻松从各种不同的网站或者网页获取大量的规范化数据,帮助任何需要从网页获取信息的客户实现数据自动化采集,编辑,规范化,摆脱对人工搜索及收集数据的依赖,从而降低获取信息的成本,提高效率。
云采集:
采集任务自动分配到云端多台服务器同时执行,提高采集效率,可以很短的时间内获取成千上万条信息
拖拽式采集流程:
模拟人的操作思维模式,可以登陆,输入数据,点击链接,按钮等,还能对不同情况采取不同的采集流程。
图文识别:
内置可扩展的OCR接口,支持解析图片中的文字,可将图片上的文字提取出来。
中文分词
中文分词是处理中文信息的基础与关键。
由于Lucene自带的分词器对英文的分词效果较好,但对中文的分词效果并不如意。
为了使检索系统能更好的处理中文信息,本文采用了IKAnalyzer作为分词器。
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。
从2006年12月推出1.0版开始,IKAnalyzer已经推出了3个大版本。
最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。
新版本的IKAnalyzer3.X则发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。
IKAnalyzer的特性:
采用了特有的“正向迭代最细粒度切分算法“,具有60万字/秒的高速处理能力。
采用了多子处理器分析模式,支持:
英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科学计数法),中文词汇(姓名、地名处理)等分词处理。
优化的词典存储,更小的内存占用。
支持用户词典扩展定义
针对Lucene全文检索优化的查询分析器IKQueryParser;
采用歧义分析算法优化
查询关键字的搜索排列组合,能极大的提高Lucene检索的命中率。
Lucene创建及使用方法
1.写入流程:
即创建索引
一、首先实例化一个构造器
IndexWriter
writer
=
new
IndexWriter("
D:
/index/"
IKAnalyzer(),
true);
//索引的存储位置
这个构造函数具有三个参数:
1.path:
索引文件存放的路径。
如:
Stringpath="
E:
\\index"
;
2.
a:
分词工具,因为lucene为外国人所开发,所以对中文分词不是很友好,这里引入IKAnalyzer专门针对中文的分词。
。
a=newIKAnalyzer()
3.create:
它是一个boolean型变量,如果为true,表示要重写指定的存放索引目录下的索引文件;
如果为false,表示在指定存放索引目录下已经存在的索引文件的基础上,向其中继续追加新的索引文件。
二、
创建索引
第一步并未创建索引,只是实例化了一个索引器,建立索引的过程是在一个IndexWriter索引器实例存在的前提下,通过为其添加Document,这样才能真正添加索引。
索引是信息检索引擎工作的第一步,只有建立了索引才能进行信息检索。
Lucene用Document逻辑文件和Field域来组织各种数据源。
Document向Lucene提供原始的要索引的文本内容,Lucene从Document中取出相关的数据源,并根据属性配置进行相应的处理,建立索引。
代码如下:
foreach(variteminproductlist)
{
Documentdoc=newDocument();
doc.Add(newField("
id"
item.id.ToString(),Field.Store.YES,Field.Index.UN_TOKENIZED));
//其中ID、Name、Add都是数据库中的字段名,
doc.Add(newField("
productname"
item.productname,Field.Store.YES,Field.Index.TOKENIZED));
doc.Add(newField("
productdes"
item.productdes,Field.Store.YES,Field.Index.UN_TOKENIZED));
tradename"
item.tradename,Field.Store.YES,Field.Index.UN_TOKENIZED));
companyname"
panyname,Field.Store.YES,Field.Index.UN_TOKENIZED));
fhdes"
item.fhdes,Field.Store.YES,Field.Index.TOKENIZED));
pic"
item.pic,Field.Store.YES,Field.Index.UN_TOKENIZED));
areaname"
item.areaname,Field.Store.YES,Field.Index.UN_TOKENIZED));
tradeid"
item.tradeid.ToString(),Field.Store.YES,Field.Index.UN_TOKENIZED));
writer.AddDocument(doc);
}
1.
Field:
可以理解成索引文件中一个个的字段块,占用空间按字段长度分配。
2.
Store:
一个内部类,它是static的,主要为了设置Field的存储属性.
public
static
final
Store
COMPRESS
Store("
COMPRESS"
);
//
在索引中压缩存储Field的值
YES
YES"
//在索引中存储Field的值
NO
NO"
在索引中不存储Field的值
3.
Index:
通过Index设置索引方式,,不对Field进行索引,所以这个Field就不能被检索到(一般来说,建立索引而使它不被检索,这是没有意义的),如果对该Field还设置了Field.Store为Field.Store.YES或Field.Store.COMPRESS,则可以检索
ublic
Index
TOKENIZED
Index("
TOKENIZED"
对Field进行索引,同时还要对其进行分词(由Analyzer来管理如何分词)
UN_TOKENIZED
UN_TOKENIZED"
对Field进行索引,但不对其进行分词
NO_NORMS
NO_NORMS"
对Field进行索引,但是不使用Analyzer
三、
优化索引,关闭写入
writer.Optimize();
//添加完所有document,我们对索引进行优化,优化主要是将多个索引文件合并到一个,有利于提高索引速度。
writer.Close();
//随后将writer关闭,这点很重要。
2.读出流程(即使用索引)
创建一个容器来存放你从索引文件中读取到的数据,这里我们使用Table
private
DataTable
dt()
{
mytab
DataTable();
mytab.Columns.Add("
ID"
TRADENAME"
AREANAME"
COMPANYNAME"
FHDES"
PRODUCTNAME"
PIC"
mytab.Clear();
return
mytab;
}
读取索引文件中的数据
IndexSearcher
LuceneSource()
string
INDEX_STORE_PATH
"
//INDEX_STORE_PATH
为索引存储目录
IndexSearcher(INDEX_STORE_PATH);
3.Lucene的搜索
Lucene建立了功能强大的索引机制为搜索服务,这是因为在检索系统的使用中,用户体验最深的还是搜索部分。
如果这一部分的性能无法达到用户要求,那么软件就没有太大的意义。
Lucene的搜索相当强大,它提供了很多辅助查询类,每个类都继承自Query类,各自完成一种特殊的查询,你可以像搭积木一样将它们任意组合使用,完成一些复杂操作;
另外lucene还提供了Sort类对结果进行排序,提供了Filter类对查询条件进行限制。
你或许会不自觉地拿它跟SQL语句进行比较:
“lucene能执行and、or、orderby、where、like‘%xx%’操作吗?
”回答是:
“当然没问题!
”Lucene中有各种各样的Query
下面我们看看lucene到底允许我们进行哪些查询操作:
TermQuery
首先介绍最基本的查询,如果你想执行一个这样的查询:
“在content域中包含‘lucene’的document”,那么你可以用TermQuery:
Term
t
Term("
content"
lucene"
Query
query
TermQuery(t);
BooleanQuery
如果你想这么查询:
“在content域中包含java或perl的document”,那么你可以建立两个TermQuery并把它们用BooleanQuery连接起来:
TermQuery
termQuery1
TermQuery(new
java"
termQuery
2
perl"
BooleanQuery
booleanQuery
BooleanQuery();
booleanQuery.add(termQuery
1,
BooleanClause.Occur.SHOULD);
2,
Tip:
清单此处的BooleanClause.Occur,此类有2个重要的属性,SHOULD和MUST,SHOULD你就理解成SQL里’OR’,MUST理解成SQL里的’AND’,
WildcardQuery
如果你想对某单词进行通配符查询,你可以用WildcardQuery,通配符包括’?
’匹配一个任意字符和’*’匹配零个或多个任意字符,例如你搜索’use*’,你可能找到’useful’或者’useless’:
WildcardQuery(new
use*"
你可能对中日关系比较感兴趣,想查找‘中’和‘日’挨得比较近(5个字的距离内)的文章,超过这个距离的不予考虑,你可以:
PhraseQuery
PhraseQuery();
query.setSlop(5);
query.add(new
content
“中”));
Term(“content”,
“日”));
那么它可能搜到“中日合作……”、“中方和日方……”,
PrefixQuery
如果你想搜以‘中’开头的词语,你可以用PrefixQuery:
PrefixQuery
PrefixQuery(new
中"
FuzzyQuery
FuzzyQuery用来搜索相似的term,使用Levenshtein算法。
假设你想搜索跟‘wuzza’相似的词语,你可以:
FuzzyQuery(new
wuzza"
你可能得到„fuzzy‟和„wuzzy‟。
RangeQuery
另一个常用的Query是RangeQuery,你也许想搜索时间域从20060101到20060130之间的document,你可以用RangeQuery:
RangeQuery
RangeQuery(new
Term(“time”,
“20060101”),
“20060130”),
最后的true表示用闭合区间。
4.取得从索引文件中过滤后的数据
有时你想要一个排好序的结果集,就像SQL语句的“order
by”,lucene能做到:
通过Sort。
Hits
LuceneFilteridSource(BooleanQuery
bq)
mysearch
LuceneSource();
Sort
sort
Sort(new
SortField("
SortField.DOC,
false));
//排序
mysearch.Search(bq,
sort);
Sort是对数据进行排序,比如这里对ID进行排序.
注意,LUCENE不支持关键词为空的情况,所以如果你想把索引文件中所有的数据都调用出来,那可以用如下方法
for
(int
i
0;
<
mysearch.MaxDoc();
i++)
Document
doc
mysearch.Doc(i);
FillingTable(mytab,
doc);
5.把过滤后的数据并扔入Table数据源
void
FillingTable(DataTable
dt,
doc)
DataRow
myrow;
myrow
dt.NewRow();
myrow[0]
doc.Get("
).ToString();
myrow[1]
myrow[2]
myrow[3]
myrow[4]
myrow[5]
myrow[6]
dt.Rows.Add(myrow);
myrow.AcceptChanges();
从Lucene中学到更多
Luene的确是一个面对对象设计的典范
(1)所有的问题都通过一个额外抽象层来方便以后的扩展和重用:
你可以通过重新实现来达到自己的目的,而对
其他模块而不需要;
(2)简单的应用入口Searcher,
Indexer,并调用底层一系列组件协同的完成搜索任务;
(3)所有的对象的任务都非常专一:
比如搜索过程:
QueryParser分析将查询语句转换成一系列的精确查询的组合
(Query),通过底层的索引读取结构IndexReader进行索引的读取,并用相应的打分器给搜索结果进行打分/排序等。
所有的功能模块原子化程度非常高,因此可以通过重新实现而不需要修改其他模块。
(4)除了灵活的应用接口设计,Lucene还提供了一些适合大多数应用的语言分析器实现(SimpleAnalyser,StandardAnalyser),这也是新
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息 检索 论文 基于 lucene 实验 大学