博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

lucene中的索引结构(1)——概念

Posted on 2006-08-02 23:06  20andlife  阅读(3100)  评论(0编辑  收藏  举报
定义:

在lucene中最基本的概念是索引(index),文档(document),域(field)和项(term),他们之间的基本关系是这样的:

一个索引包含一系列的文档;

一个文档是一系列域的集合

一个域是一系列命了名称的项的集合

一个项是一个字符串

或者这样理解,如果把整个看作是一个数据表,那么域相当于这个数据表中的某一列,项则是对应某一列中的字符串关键字。也就是我们通常意义上的字符串分词以后的关键字,文档可以看成是一次插入到数据库中的所有数据的集合。

所以说,如果相同的字符串在不同的域中肯定是作为不同的项来对待的,项(terms)被标成成为字符串对的形式:第一个字符串用来命名域(field),第二个用来表示该域下文本的值

倒排索引:索引文件为了使得以项(term)为基础的搜索更加有效而储存有所有项(term)的统计数字。Lucene的索引使用的是一种叫做倒排索引(inverted index)的索引方式,这是因为,这种索引方式是从特定的关键字可以列出所有包含它的文档,与通常方式的由文档列出所有关键字正好是反过来的

域的类型:在lucene中,域可能被储存,在这种情况下这些域下的文本被按照字面意义的按照通常方式存储下来,被倒排的域称为索引了的域。一个域可能既被存储又被索引

域中的内容可能被分词成为一个个的项来进行索引,也有可能整个域下的内容就作为一个项来进行索引。类比到SQL server中的情形:我们说的前一种情况可以类比到那种某一列由大段文本组成,然后我们对这一列进行全文索引,然后文本会被分词程序分成一个个的关键词。然后索引。后一种情况类比到某一列的数据类型为datetime或者干脆为int类型,有时候我们需要为这样的列进行索引比如说取出某时间点之前存入的所有数据等等。这个时候我们没有必要也不会去对这样的类型分词以后索引,而是对整个域中的内容索引。还有一种情况就是,域中的内容只分词以后进行索引,但是不进行储存。这样的情况可以对应到进行web搜索时的头部meta信息。对于这样的信息我们只需要索引,不需要进行储存

:段这个概念不好理解,官方的解释是这样的:lucene的索引可能由若干子索引(sub-index)或者段(segment)组成。每一个段都是一个相对独立的可以单独进行搜索的索引。lucene的索引是这样产生的:

1、为新加入到全文索引中的文档创建单独的段结构

2、合并已经存在的段

搜索可能会要牵涉到多个段或者索引结构,每一个索引可能又有若干个段组成

这样理解吧:一次插入到lucene中的数据,并不会马上合并到已经创建好的索引结构中,lucene会单独的为这一部分数据建立一个索引结构。这部分结构由若干个文件组成(这一部分在后面会进行具体分析),这些文件有些是记录数据的,有些是记录关键词频率,或者位置或者域信息的。所有这些文件的集合就构成了一个段(segment),这些文件有统一的前缀名。也就是段的名称。只是后缀名称不同。当所有数据收集完毕以后。系统会自动地合并所有这些小的分散的索引。合并索引的目的在于缩短搜索的时间