Posted on 2007-05-22 18:16
vcommon 阅读(1062)
评论(0) 编辑 收藏 引用
FirteX的程序思想和组织结构
1:FirteX使用MFC架构。
2:FirteX结构相当灵活,可以任意扩充。
3:基本思想:
1:主要的namespace:
a:Collection:有多种Collection,DirCollection ,FileListCollection,TrecCollection,FirTexCollection
b:parser:有多种parser,CPlainParser,和通过IParserPlugin扩充的CHTMLParserPlugin
c:analyzer:有多种analyzer,CChineseAnalyzer,CDateTimeAnalyzer
1:程序流程:
通过一个实例解释程序流程:从一个文件夹的所有文本文件中建立索引并查找。
a:选择参数。使用DirCollection收集一个文件夹的内容,指定CPlainParser从txt文件中建立索引,指定CChineseAnalyzer对中文词语进行索引。
b:CIndexWriter 开始。 CIndexWriter::prepareBuildIndex中根据参数创建所有的实例,比如DirCollection,CPlainParser,CChineseAnalyzer,CIndexWriter。
c:CCollection::scan()完成建立索引的过程。DirCollection遍历所有的文件,使CAnalyzer::analyze所有的文件。CAnalyzer将先用CPlainParser parse一遍,最后自己再analyze一遍。注意这两遍完成了最主要的工作。
d:CPlainParser 的parser过程。
1:schema:title,contents,能从文件中查询多种段,CPlainParser 只有contents,html中有url,title等可以分schema查询。
2:CMetadata,可以是MT_STR,MT_NUMBER等可以查询词或数字。
3:CField类,通过CReader分析,是某种schema下的某种CMetada
4:Parser只是将Analyzer分开,以便多次多种Analyzer。
e:CChineseAnalyzer把所有信息存入索引文件。CChineseAnalyzer进行的最主要的分词等功能。使用双数组Trie进行创建检索。但是并没有加入双数组Trie的生成。所以CChineseAnalyzer的作用就是利用文件中保存的双数组Trie进行分词等。双数组Trie的作用就是一个庞大的状态机。
一个最小的例子:有5个词语的双数组Trie。“中华” “中餐馆”“中午”“中华人民共和国”“人”。分析一句话“中华有56民族”。首先,确定状态机的表示值。这个值在Firtex中其实是存在coredict.pdat里的。我们重新定义一下。
“民” 1 == end
“午” 3== end
"中" 2 "华" 4 人 5 民 6 共 7 和 8 国 9 ==end
餐 10 馆 11
比如,这句话“中华有56民族”,首先通过一个巨大的数组,得到“中”的状态-2。然后记录下来。得到“华” "华"会从2状态为基础进行,所以进入状态4。最后得到本句话,241。写入索引文件(当然还有许多其他信息)。
如果有人查找"中",2命中,有人查找"中华",4命中,直接通过数字查找,速度相当的快。
所以词语的量是比较少的,一旦词汇量上去的,双数组Trie复杂程度就直线增长。
结论:
所以Firtex是一个非常灵活,有效率的系统,适合做文件查找。但不适合文件标注或自然语言理解的开发。