sphinx的代码结构分析

来源:互联网 发布:程序员手机壁纸1080 编辑:程序博客网 时间:2024/04/28 13:24

Coreseek代码结构分析

本文档对coreseek的系统组成和代码主要流程做一个说明。

一.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的索引建立、查询和合并的主要工作流程。图后面有简要说明。

 

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)        合并索引结束(第二十二步)

 


三.文件目录结构

1. 目录结构

把主要的文件目录结构做一个简单说明。省略了部分编译配置文件和一些说明文件。

 

|-- 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 测试环境运行数据

 

 

2. Csft/src目录下的文件用途说明

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

原创粉丝点击