本文档对coreseek的系统组成和代码主要流程做一个说明。
Coreseek整个系统的组成,可用下图来表示。
整个coreseek系统由多个可执行程序和一套api组成。
1. 可执行程序主要由下面这些组成:
a) 索引建立和维护程序(索引程序indexer)
b) 查询服务程序(后台服务程序searchd)
c) 辅助工具程序(search, spelldump等)
2. Api主要由下面两个组成
a) 应用程序api(包括ruby,C/C++, Python, php的程序api)
b) Mysql的sphinxSE引擎接口
下图简要描述了coreseek的索引建立、查询和合并的主要工作流程。图后面有简要说明。
Coreseek的主要工作流程可以分成三部分:
l 首先建立主索引;
l 而后在主索引基础上进行查询;
l 根据业务需要每隔一段时间,对新增的业务数据建立增量索引,并将增量索引合并到主索引里面。
1. 索引的建立(1-5步)
a) 使用者首先必须建立索引,才能使用coreseek系统进行查询(第一步)
b) 索引程序根据用户请求,读取配置文件,从源数据中读取数据。(第二步)
c) 根据源数据的数据进行分析计算,建立索引(第三步)
d) 将建立的索引写入到索引文件(第四步)
e) 返回索引建立结束的消息(第五步)
2. 根据索引进行查询(6-11步)
a) 使用者调用查询api,输入查询的关键词和条件(第六步)
b) Api将用户的输入,转化成查询的数据包,发送到sphinx查询服务器(第七步)
c) 查询服务器到索引文件中进行查询,得到查询结果(第八步)
d) 返回查询结果给用户(第九步—第十一步)
3. 增量索引的建立和合并(12-22步)
a) 每隔一段时间,当业务数据发生更改的时候,需要将更改的数据合并到索引中,以便在查询中能够查询到更改以后的数据。这需要使用者先发起索引建立的请求,对增量数据建立增量索引(第十二步)
b) 索引程序从源数据中,查询到从上次建立索引到现在这段时间中,产生更新的数据(第十三步)
c) 对这部分更新的数据进行分析计算,建立增量索引(第十四步)
d) 将增量索引写入到增量索引文件中(第十五步)
e) 建立增量索引结束(第十六步)
f) 用户发出指令,对增量索引和主索引进行合并(第十七步)
g) 从增量索引文件读取增量索引的数据(第十八步)
h) 从主索引读取主索引的数据(第十九步)
i) 合并增量索引和主索引(第二十步)
j) 将合并后的索引写入到新的索引文件,用新的索引文件替换主索引(第二十一步)
k) 合并索引结束(第二十二步)
把主要的文件目录结构做一个简单说明。省略了部分编译配置文件和一些说明文件。
|-- csft-3.2.14 coreseek源代码
| |-- api 包括java,ruby,C/C++,php的sphinx访问api接口
| |-- codeblocks code block的项目工程文件
| |-- config 编译环境的配置文件
| |-- contrib 放置第三方扩展的api接口和常用脚本,但目前基本为空
| |-- csft.doc 空置
| |-- csft.pytest python的一个脚本,可以忽略
| |-- doc 用户手册和部分说明文档。对使用和阅读代码有作用,强烈建议阅读。
| |-- example.sql 生成手册和测试里面提到的示例数据库schema的sql脚本
| |-- libexpat vc的工程项目文件
| |-- libstemmer_c vc的工程项目文件
| |-- misc 一些辅助文件,可以忽略
| |-- mysqlse sphinxSE的文件,是mysql的引擎文件,放在编译mysql的时候进行编译
| |-- pymmseg mmseg提供出来的python接口
| |-- src coreseek源代码目录。核心代码全部在这里
| |-- test 测试代码
| `-- win windows下的工程配置文件
|-- mmseg-3.2.14 mmseg源代码
| |-- config 编译配置文件
| |-- data 词典文件
| |-- python python接口api代码
| |-- ruby ruby接口api代码
| |-- script python的一部分生成字典的脚本
| |-- src mmseg的源代码目录,核心代码都在这里
`-- testpack 测试配置和数据包
|-- api 测试环境需要的api接口和测试脚本
|-- etc 测试环境配置文件
`-- var 测试环境运行数据
csft-3.2.14/src
|-- indexer.cpp 索引程序index的入口主函数
|-- indextool.cpp 工具程序indextool的入口主函数
|-- llsphinxql.c sphinql的语法分析器Flex
|-- md5.cpp 实现md5算法的代码
|-- md5.h 实现md5算法的代码
|-- py_helper.cpp 跟python语言交互的接口代码
|-- py_helper.h 跟python语言交互的接口代码
|-- py_layer.cpp 跟python语言相关的代码
|-- py_layer.h 跟python语言相关的代码
|-- py_source.cpp 跟python语言相关的代码
|-- py_source.h 跟python语言相关的代码
|-- py_sphinx.c 跟python语言相关的代码
|-- py_sphinx_interface.cpp 跟python语言相关的代码
|-- py_sphinx_interface.h 跟python语言相关的代码
|-- search.cpp 工具程序search的入口主函数
|-- searchd.cpp 查询程序searchd的入口主函数
|-- spelldump.cpp 工具程序spelldump的入口主函数
|-- sphinx.cpp 主要的逻辑代码,索引建立合并和查询主要的逻辑都在这里。
|-- sphinx.h
|-- sphinx_internal.h
|-- sphinxcustomsort.inl 支持用户自定义排序的一个文件,用于支持 @custom 的排序方式
|-- sphinxexcerpt.cpp 产生文本摘要和高亮的代码
|-- sphinxexcerpt.h
|-- sphinxexpr.cpp 跟语法分析器有关的代码
|-- sphinxexpr.h 跟语法分析器有关的代码
|-- sphinxexpr.y 语法分析器yacc的输入文件
|-- sphinxfilter.cpp sphinx过滤器filter的实现代码
|-- sphinxfilter.h
|-- sphinxmetaphone.cpp 实现Metaphone算法的代码,它是一种基于音标的词干组织法。
|-- sphinxql.l sphinxql的语法分析器lex的输入文件
|-- sphinxql.y sphinxql的语法yacc的输入文件
|-- sphinxquery.cpp sphinx查询语句的解析代码,对查询语句进行解析,并生成语法分析树
|-- sphinxquery.h
|-- sphinxquery.y sphinxql的语法yacc的输入文件
|-- sphinxselect.y sphinxql的语法yacc的输入文件
|-- sphinxsort.cpp 排序算法实现代码
|-- sphinxsoundex.cpp 语音编码算法代码
|-- sphinxstd.cpp 一部分通用的代码,如lock锁,Mutex,随机器等封装好的代码。
|-- sphinxstd.h
|-- sphinxstem.h 词干提炼代码的头文件
|-- sphinxstemcz.cpp 捷克语词干的提炼代码
|-- sphinxstemen.cpp 英语的词干提炼代码
|-- sphinxstemru.cpp 俄语的词干提炼代码
|-- sphinxstemru.inl 俄语的词干提炼代码
|-- sphinxtimers.h 计时器代码,这个是用来做sphinx内部性能分析用,看耗时主要在哪部分
|-- sphinxutils.cpp 对配置文件进行解析的代码
|-- sphinxutils.h
|-- sphinxversion.h 定义sphinx版本的宏
|-- tests.cpp 对分词器进行测试的代码
|-- tokenizer_zhcn.cpp 中文分词器的实现代码
|-- tokenizer_zhcn.h 中文分词器的实现代码
|-- yy.cmd 后面这部分yyxxx.xx的文件都是跟语法分析器相关的文件,不再一一分析。
|-- yysphinxexpr.c 跟语法分析器相关的文件
|-- yysphinxexpr.h 跟语法分析器相关的文件
|-- yysphinxql.c 跟语法分析器相关的文件
|-- yysphinxql.h 跟语法分析器相关的文件
|-- yysphinxquery.c 跟语法分析器相关的文件
|-- yysphinxquery.h 跟语法分析器相关的文件
|-- yysphinxselect.c 跟语法分析器相关的文件
`-- yysphinxselect.h 跟语法分析器相关的文件
转自http://blog.csdn.net/uestc_huan/article/details/6395174