专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »编程综合 » lucene更新索引:Lucene.Net 2.3.1开发介绍 3、索引(一) »正文

lucene更新索引:Lucene.Net 2.3.1开发介绍 3、索引(一)

来源: 发布时间:星期四, 2009年1月15日 浏览:45次 评论:0
  在说索引的前先说说索引是什么?为什么要索引?如何索引?

  先想想看假如现在有个文本我们会如何去搜索比如 = "abcdefghijklmnopqrstuvwxyz"这都是26个字母现在要看看里面是不是有a用IndexOf就可以很方便实现现在数据量大了在数据库里已经有100多条数据了当然利用数据库提供操作思路方法也可以很方便查找而这里先抛开数据库把这100多条记录放到N个文本文件中现在要在里面搜索含有“Lucene”这个词记录那如何办呢?如果只简单地使用逐个文件逐字扫描那和用Windows内置搜索搜索张图片名或者文本没什么分别那么每次搜索都会需要大量时间而google和baidu为什么能做到那么快呢?既然刚才我们是抛开数据库是不是使用了数据库就能实现呢?从我长期使用经验来看数据库肯定是不行(这里指关系型数据库要是出某些专门为搜索做数据库那就另外说了)什么东西在搜索时候足够快呢?在C#类型里就有这么几个比如Hashtable,Dictionary做搜索引擎是否也可以应用这样思想?显然是可以!有很多东西在微观(这里指小个算法或者个小型数据结构应用)和宏观(这里指框架级或者系统级)上名字不但是都有很多相似性和可比性无疑Lucene.Net就是这样个框架实现了Hashtable更加宏观现象!当然也是有很多差别

  Lucene.Net用就是倒排索引种数据结构记得以前看过篇文章讲在面向对象时代数据结构作用被减弱了我觉得这个观点至少在Lucene.Net上必须被抛弃回答原先问题什么是索引?纵观搜索引擎发展历史早期搜索引擎都是基于关键字和目录而现在已经转变成全文搜索若要问什么是索引那就是你有本书你看到了第 8页是写个故事你用张纸把故事名称记录下来那就是索引目录页数编号等等都可以算是索引Lucene.Net用就是倒排索引那什么是倒排索引?那就是对段文本就行分析按分析结果把分析得到关键字建立索引比如“我在用Lucene.Net用StandardAnalyzer分词器索引后就会存储“我”“在”“用”“Lucene”“.”“Net””这些词也就是说索引是以词为单位存储同时记录下了这些词出现在了哪个文档中以及出现位置和频率很像在数据库里做冗余不是吗?这些需要计算数据都已经记录下来直接读取就可以看了从理论上说在定义使用M种语言情况下出现词数量总是有限从这里也可以看出分词是如此重要分词让N个字连成了个整体用这个整体中任何个字是查不到这个整体除非以牺牲速度为代价以前说google水土不服就是google在中文分词上不如baidu但是这个差距在缩小

  而另外个问题为什么要索引也就不难解答了至于如何索引这又是个很长故事了

  1、逻辑存储结构

  词在倒排索引中是最小单位在Lucene.Net中衡量单位是Term由N个Term构成了Filed而又有N个Filed组成了DocumentN个Document又会组成个SegmentN个Segment会被写到Lucene.Net文件系统文件系统留到后面再讲Lucene.Net自己实现了自己文件系统而这个系统最小单位由3个文件组成可以放到个目录下也可以放到内存中来说Lucene.Net文件系统可以理解为个个文件在Windows下就是个目录里面包含了 3个文件但是从Lucene.Net逻辑上来说这就是个文件然后文件里文本分词N个章节那就是Segment每个段落又会有N个段落(Document)段落里每句话就是Filed而Term就是每个字和我们处理习惯很像不是吗?而其中最重要就是Term其他都是为它排版用

  而这个索引相对于分词也可以用另外个类来衡量那就是——Token是不是很熟悉?Term和Token文本是只是记录有关这个文本属性不

  前面写到了两次写入索引操作代码大同小异都是先建立个分词器然后把分词器交给IndexWriter接着创建N个Document往Docuemnt里填充Field再把Document交给IndexWriter操作就完成了整个索引过程有关Segment处理被黑箱子掉了而Term处理也仅仅能从分词器看到个大概

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: