09/12
31
本文将详细介绍什么是Makefile,为什么linux下编程我们需要Makefile,以及最简单的Makefile应该如何编写。
09/12
31
关于 Makefile 的一些入门资料。。。
09/12
30
这是一篇隐藏日志。您需要以合适的身份登入后才能查看。
09/12
30
这是一篇隐藏日志。您需要以合适的身份登入后才能查看。
09/12
30
转自: http://www.chinaaet.com/article/index.aspx?id=19110
Pachube
英国一家初创公司。Pachube允许你标记并分享即时传感器数据(来自物体、设备、建筑物,以及虚拟和实体环境)。公司创始人Usman Haque称,与其说Pachube和传感器有关,倒不如说其和环境有关。Pachube致力于快速识别并影响你的环境。
IBM的传感器解决方案
IBM 在物联网领域领先的大公司,提供RFID(无线射频识别技术)和传感器技术解决方案。IBM今年和不同的制造商和商品供应商合作,一起把这些解决方案推向全球。
Arduino
Arduino是一个开源电子设备原型设计平台,由开源硬件和软件组成,专门为那些艺术家、设计者,以及对创建互动物体和环境感兴趣的人们而打造。
联邦快递SenseAware
国际快递巨人联邦快递在12月份为包裹推出了一种新型跟踪装置和网络服务,名字叫做SenseAware,它可以显示包裹的温度、地点和其它重要信息,比如是否被打开过或被玩耍过。目前联邦快递已经和50家保健公司和生命科学公司展开了试点合作,用于跟踪手术工具包,医疗设备和器官等。
惠普CeNSE
惠普最近宣布了一个叫做CeNSE(地球中枢神经系统)的科研项目,旨在通过十亿个微型、廉价、结实、敏感的探测器建立一个全球传感网络,该项目的技术来自惠普实验室的纳米传感技术。
日本的西瓜卡(Suica Card)和香港的章鱼卡
今年年初我们曾介绍了三种全球领先的RFID智能卡:日本的西瓜卡,伦敦的牡蛎卡,和香港的章鱼卡。在日本和香港,这些智能卡可以用来从某些商店里购物,或者进入学校和公寓的凭证装置。
Mir:ror
Mir:ror是法国Violet公司生产的一种装置,它可以发现你给它看的物体,然后做出回应。这种魔镜并非自身感应物体,而是通过读取物体上的RFID标签来告诉电脑做什么。
WideNoise
WideNoise是一个iPhone软件,可以对周围环境的噪音级别进行取样,然后显示在一张互动地图上。 如果你在做房地产生意,或者想找一个安静的场所,不妨试试。
ioBridge
ioBridge是一个用于远程控制和监测的网络平台,并自称向“天网(Skynet)”迈进了一步。
德州仪器公司的工程师Morey在业余时间通过Twitter和ioBridge开发了一个双向家用自动化软件。
Citysense
Sense Networks是一家致力于通过即时性和历史性位置数据为现实世界建立目录的公司。公司有一个叫做Macrosense的平台,可以接收即时位置信息,并对其进行分析和处理,然后进行保存供人们查询。
他们已经利用这个平台开发了一款叫做Citysense的软件(适用于iPhone和黑莓手机),允许旧金山的人们即时查看最新的夜生活。
Pachube
英国一家初创公司。Pachube允许你标记并分享即时传感器数据(来自物体、设备、建筑物,以及虚拟和实体环境)。公司创始人Usman Haque称,与其说Pachube和传感器有关,倒不如说其和环境有关。Pachube致力于快速识别并影响你的环境。
IBM的传感器解决方案
IBM 在物联网领域领先的大公司,提供RFID(无线射频识别技术)和传感器技术解决方案。IBM今年和不同的制造商和商品供应商合作,一起把这些解决方案推向全球。
Arduino
Arduino是一个开源电子设备原型设计平台,由开源硬件和软件组成,专门为那些艺术家、设计者,以及对创建互动物体和环境感兴趣的人们而打造。
联邦快递SenseAware
国际快递巨人联邦快递在12月份为包裹推出了一种新型跟踪装置和网络服务,名字叫做SenseAware,它可以显示包裹的温度、地点和其它重要信息,比如是否被打开过或被玩耍过。目前联邦快递已经和50家保健公司和生命科学公司展开了试点合作,用于跟踪手术工具包,医疗设备和器官等。
惠普CeNSE
惠普最近宣布了一个叫做CeNSE(地球中枢神经系统)的科研项目,旨在通过十亿个微型、廉价、结实、敏感的探测器建立一个全球传感网络,该项目的技术来自惠普实验室的纳米传感技术。
日本的西瓜卡(Suica Card)和香港的章鱼卡
今年年初我们曾介绍了三种全球领先的RFID智能卡:日本的西瓜卡,伦敦的牡蛎卡,和香港的章鱼卡。在日本和香港,这些智能卡可以用来从某些商店里购物,或者进入学校和公寓的凭证装置。
Mir:ror
Mir:ror是法国Violet公司生产的一种装置,它可以发现你给它看的物体,然后做出回应。这种魔镜并非自身感应物体,而是通过读取物体上的RFID标签来告诉电脑做什么。
WideNoise
WideNoise是一个iPhone软件,可以对周围环境的噪音级别进行取样,然后显示在一张互动地图上。 如果你在做房地产生意,或者想找一个安静的场所,不妨试试。
ioBridge
ioBridge是一个用于远程控制和监测的网络平台,并自称向“天网(Skynet)”迈进了一步。
德州仪器公司的工程师Morey在业余时间通过Twitter和ioBridge开发了一个双向家用自动化软件。
Citysense
Sense Networks是一家致力于通过即时性和历史性位置数据为现实世界建立目录的公司。公司有一个叫做Macrosense的平台,可以接收即时位置信息,并对其进行分析和处理,然后进行保存供人们查询。
他们已经利用这个平台开发了一款叫做Citysense的软件(适用于iPhone和黑莓手机),允许旧金山的人们即时查看最新的夜生活。
09/12
30
不要以为用信用卡消费了就一定要按时还钱,不按时还就会影响信用记录,错误的观念哦!银行推行信用卡的其中一个目的是赚你利息,你按时足额还上那银行赚什么啊?(虽然银行可以从商户那收取一些手续费)。所以手头比较紧的朋友,你只要还最低还款额就行了,给自己方便的同时,也让银行赚点钱,每次按时足额还上最低还款额(不是全额),是不会影响你的个人信用的,银行最喜欢这样的人了。而且根据经验,经常只还最低还款额的人,比较容易提升信用额度。别以为你每次按时全额还款,你的额度就提升的快,你不给银行多做贡献,人家干吗要给你提额度? 当然了,每个银行对提升额度的要求不一样,这个呢只是有助于提升额度而已,不保证100% 成功。
.......
.......
09/12
28
随着Windows 7 发布的日子就要来临,在CB上不断的更新着各种版本的Win 7 的消息,这不,Win 7 的RC版本马上就出来了。在这里给大家充个电,其实一个正统的软件从雏形到上架,每次更新都是有自己的“代号”的,比如Alpha, Beta, RC, Release这些,都是软件版本的命名规则。那么这些代表什么意思呢?还请往下看:
Alpha版: 也写作α版(阿尔法,希腊字母的第一位,代表最初的版本),Alpha是内部测试版,此版本表示该软件在此阶段主要是以实现软件功能为主,通常只在软件开发者内部交流,一般而言,该版本软件的Bug较多,需要继续修改,除非你也是测试人员,否则不建议使用。
Beta版: β, 中文称作贝塔版,可以理解成为公测版,该版本相对于α版已有了很大的改进,消除了严重的错误,但还是存在着一些缺陷,需要经过多次测试来进一步消除,此版本主要的修改对像是软件的UI。
RC版: (Release Candidate),软件发行的最终候选版本。该版本已经相当成熟了,基本上不存在导致错误的BUG,与即将发行的正式版相差无几。与Beta版相比,此时不会加入太多的新功能,而主要着重于排错。
RTM(Release to Manufacture) ,也称作Release版, 该版本意味“最终版本”,在前面版本的一系列测试版之后,终归会有一个正式版本,是最终交付用户使用的一个版本。我们在商店买的正版软件都是RTM(Release)版的,该版本有时也称为标准版。一般情况下,Release不会以单词形式出现在软件封面上,取而代之的是符号(R)。
而Windows中,发行版本里还有更多的名称,稍微讲解一些吧
OEM版:是给计算机厂商随着计算机贩卖的,也就是随机版。只能随机器出货,不能零售。只能全新安装,不能从旧有操作系统升级。如果买笔记型计算机或品牌计算机就会有随机版软件。包装不像零售版精美,通常只有一面CD和说明书(授权书)。
RTL版:是真正的正式版,正式上架零售版。在安装盘的i386文件夹里有一个eula.txt,最后有一行EULAID,就是你的版本。比如简体中文正式版是EULAID:WX.4_PRO_RTL_CN,繁体中文正式版是WX.4_PRO_RTL_TW。其中:如果是WX.开头是正式版,WB.开头是测试版。_PRE,代表家庭版;_PRO,代表专业版。
VOL版:(Volume Licensing for Organizations):团体批量许可证(大量采购授权合约)。可能有人会认为这个不是vlo么?其实vol是取了volume的前3个字母而已,不是3个词的字母缩写。比如英文wxp pro的vol版本的光盘卷标就是wxpvol_en,其中wx表示是windows xp,p是professional(vol没有home版本),vol表明是团体批量许可证版本,en是表明是英语。获得途径主要是集团购买,某些msdn用户也可以得到。这种版本根据购买数量等又细分为“开放式许可证(open license)”、“选择式许可证(select license)”、“企业协议(enterprise agreement)”、“学术教育许可证(academic volume licensing)”等5种版本
VLK:VLK不是一个版本!,因为经常看到不懂的人在大喊VLK版什么的,有必要声明一下!VLK,英文全称:Volume Licensing (Product) Keys,它所指的只是一个KEY(密匙),仅仅是一个为证明产品合法化、以及安装所使用的KEY,因为根据VOL计划规定,VOL产品是不需要激活的!或者说,VLK不是指一种版本,而是指这种版本在部署(deploy)过程中所需要的KEY,而需要VLK这种KEY的版本应该叫做VOL!只不过在实际中,没有必要强调这种叫法、称呼的准确性,加之很多人的VOL版本光盘是通过企业的选择式许可证、企业协议等方式得到的等等原因,所以才会有很多人叫他为“选择版”等等。
官方网站有一个表格,上面有一句话:“different products require different volume licensing keys (vlks). refer to the table below to make sure you have the correct vlk for your microsoft product.”,我想这就很好的说明了vlk指的是key而不是产品了。
像经典的DG8FV就是VLK
EVAL版:而流通在网络上的EVAL版,是微软帮媒体记者编辑上课给的,是所谓的「评估版」没错,你输入的金钥是30天的,就可用30天,输入的是180天的,就可用180天。功能上和零售版无乎没有区别。
RVL版:号称是正式版,其实RVL根本不是版本的名称。RVL.是一个Warez.Team,台湾分部叫RVL@TW.,它之间又释出一个.WinXP.RVL@TW.版本。它是某中文版+英文Corpfiles当破解的。
FPP版(Full Packaged Product)零售版,就是在各大软件店看到有漂亮包装的那种。可以升级安装,也可以全新安装。 但是需要激活,机器配置更换了还要通知微软,是比较痛苦的东西。
看了这么多,都晕了吧,不多废话了。至于HOME, PRO, ENTERPRISE, ULTIMATE这几个版本就不用多说了吧
最后一句,品牌机安OEM,攒机安装VOL,烧钱热血兼支持正版的安装RTL,FPP,玩笑话,不要当真。
Alpha版: 也写作α版(阿尔法,希腊字母的第一位,代表最初的版本),Alpha是内部测试版,此版本表示该软件在此阶段主要是以实现软件功能为主,通常只在软件开发者内部交流,一般而言,该版本软件的Bug较多,需要继续修改,除非你也是测试人员,否则不建议使用。
Beta版: β, 中文称作贝塔版,可以理解成为公测版,该版本相对于α版已有了很大的改进,消除了严重的错误,但还是存在着一些缺陷,需要经过多次测试来进一步消除,此版本主要的修改对像是软件的UI。
RC版: (Release Candidate),软件发行的最终候选版本。该版本已经相当成熟了,基本上不存在导致错误的BUG,与即将发行的正式版相差无几。与Beta版相比,此时不会加入太多的新功能,而主要着重于排错。
RTM(Release to Manufacture) ,也称作Release版, 该版本意味“最终版本”,在前面版本的一系列测试版之后,终归会有一个正式版本,是最终交付用户使用的一个版本。我们在商店买的正版软件都是RTM(Release)版的,该版本有时也称为标准版。一般情况下,Release不会以单词形式出现在软件封面上,取而代之的是符号(R)。
而Windows中,发行版本里还有更多的名称,稍微讲解一些吧
OEM版:是给计算机厂商随着计算机贩卖的,也就是随机版。只能随机器出货,不能零售。只能全新安装,不能从旧有操作系统升级。如果买笔记型计算机或品牌计算机就会有随机版软件。包装不像零售版精美,通常只有一面CD和说明书(授权书)。
RTL版:是真正的正式版,正式上架零售版。在安装盘的i386文件夹里有一个eula.txt,最后有一行EULAID,就是你的版本。比如简体中文正式版是EULAID:WX.4_PRO_RTL_CN,繁体中文正式版是WX.4_PRO_RTL_TW。其中:如果是WX.开头是正式版,WB.开头是测试版。_PRE,代表家庭版;_PRO,代表专业版。
VOL版:(Volume Licensing for Organizations):团体批量许可证(大量采购授权合约)。可能有人会认为这个不是vlo么?其实vol是取了volume的前3个字母而已,不是3个词的字母缩写。比如英文wxp pro的vol版本的光盘卷标就是wxpvol_en,其中wx表示是windows xp,p是professional(vol没有home版本),vol表明是团体批量许可证版本,en是表明是英语。获得途径主要是集团购买,某些msdn用户也可以得到。这种版本根据购买数量等又细分为“开放式许可证(open license)”、“选择式许可证(select license)”、“企业协议(enterprise agreement)”、“学术教育许可证(academic volume licensing)”等5种版本
VLK:VLK不是一个版本!,因为经常看到不懂的人在大喊VLK版什么的,有必要声明一下!VLK,英文全称:Volume Licensing (Product) Keys,它所指的只是一个KEY(密匙),仅仅是一个为证明产品合法化、以及安装所使用的KEY,因为根据VOL计划规定,VOL产品是不需要激活的!或者说,VLK不是指一种版本,而是指这种版本在部署(deploy)过程中所需要的KEY,而需要VLK这种KEY的版本应该叫做VOL!只不过在实际中,没有必要强调这种叫法、称呼的准确性,加之很多人的VOL版本光盘是通过企业的选择式许可证、企业协议等方式得到的等等原因,所以才会有很多人叫他为“选择版”等等。
官方网站有一个表格,上面有一句话:“different products require different volume licensing keys (vlks). refer to the table below to make sure you have the correct vlk for your microsoft product.”,我想这就很好的说明了vlk指的是key而不是产品了。
像经典的DG8FV就是VLK
EVAL版:而流通在网络上的EVAL版,是微软帮媒体记者编辑上课给的,是所谓的「评估版」没错,你输入的金钥是30天的,就可用30天,输入的是180天的,就可用180天。功能上和零售版无乎没有区别。
RVL版:号称是正式版,其实RVL根本不是版本的名称。RVL.是一个Warez.Team,台湾分部叫RVL@TW.,它之间又释出一个.WinXP.RVL@TW.版本。它是某中文版+英文Corpfiles当破解的。
FPP版(Full Packaged Product)零售版,就是在各大软件店看到有漂亮包装的那种。可以升级安装,也可以全新安装。 但是需要激活,机器配置更换了还要通知微软,是比较痛苦的东西。
看了这么多,都晕了吧,不多废话了。至于HOME, PRO, ENTERPRISE, ULTIMATE这几个版本就不用多说了吧
最后一句,品牌机安OEM,攒机安装VOL,烧钱热血兼支持正版的安装RTL,FPP,玩笑话,不要当真。
09/12
28
CSphSource 数据源
CSphSource_XMLPipe2-XML文件获取数据
CSphSource_SQL-SQL(MySQL)获取数据
CSphIndex 索引器
派生类CSphIndex_VLN
// 索引过程
virtual int Build ( CSphDict * pDict,
const CSphVector & dSources, // 所有数据源
int iMemoryLimit, // 内存设置
ESphDocinfo eDocinfo );
/// available docinfo storage strategies
enum ESphDocinfo
{
SPH_DOCINFO_NONE = 0, ///< no docinfo available
SPH_DOCINFO_INLINE = 1, ///< inline docinfo into index (specifically, into doclists)
SPH_DOCINFO_EXTERN = 2 ///< store docinfo separately
};
BYTE ** CSphSource_SQL::NextDocument ( CSphString & sError )
{
m_tDocInfo.m_iDocID = sphToDocid ( SqlColumn(0) ); // 取得文档ID值
}
bool CSphSource_Document::IterateHitsNext ( CSphString & sError )
{
while ( ( sWord = m_pTokenizer->GetToken() )!=NULL ) //分词
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CSphAutofile fdTmpDocinfos ("tmp2") // 存储文档信息
DOCINFO2ID(pDocinfo) = pSource->m_tDocInfo.m_iDocID; // 自定义ID
memcpy ( DOCINFO2ATTRS(pDocinfo), pSource->m_tDocInfo.m_pRowitems, sizeof(CSphRowitem)*m_tSchema.GetRowSize() );
pDocinfo += iDocinfoStride;
Sphinx使用的文件包括 "sph", "spa", "spi", "spd", "spp", "spm" ,还有锁文件。其中sph是系统的配置文件。其它则为索引文件。
.Spi 文件:保存WordId及指向此WordId对应的文档信息在spd文件的指针。Spi文件在检索程序启动时完全加载入内存。Spi文件是分块的,块内排序,块之间也排序。分块的目的应该是为了快速检索到WordId,因为Spi中的WordId是变长压缩的,索引需要先在块级别做二分定位,再在快内解压缩查找。
文件结构,每块中结构,wordId实际存储的是差值
.Spd文件:文件结构
.Spp文件: 文件结构
.Spa文件:存储DocInfo的文件,检索程序启动时会把此文件加载如内存,sphinx可以指定DocInfo的存储方式,
① 存储到spd文件中(InLine)
②. 另外单独存储。指定此,就会生成spa文件
文件结构:
.Spm文件:在DocInfo中,有一种特殊的属性,叫MVA,多值属性。Sphinx对此属性特殊处理,需要存储在spm文件中。检索程序启动时会把此文件加载如内存。此(MVA)属性在DocInfo对应位置存储其在此文件中的字节偏移量。
文件结构:
由于在第一趟扫描过程中会出现WordID相同的不同Hits(不同文档或者不同位置不同字段),二趟前会根据WordID排序,WordID相同的Hits会连续出现并合并(合并到第一次出现的相同WordID中)
/////////////////////////////////////////////
Spi文件
// 遍历所有的数据源
// 遍历所有的文档
struct CSphWordHit
{
SphDocID_t m_iDocID; ///< document ID
SphWordID_t m_iWordID; ///< word ID in current dictionary
DWORD m_iWordPos; ///< word position in current document
};
CSphWordHit.. CSphWordHit…CSphWordHit…CSphWordHit串接
dHitBlocks.Add( cidxWriteRawVLB ( fdTmpHits.GetFD(), dHits, iHits, NULL, 0, 0 ) );//
GetIndexFileName("tmp1") 将Hits流写入tmp1文件。临时文件
不论重复,不论字段
dBins[i]->ReadHit(&tHit,iRowitems,dInlineAttrs+i*iRowitems )// 重新读入内存
cidxHit(tQueue.m_pData,iRowitems?dInlineAttrs+iBin*iRowitems : NULL );
// 统计后刷入m_wrWordlist,形如以下字节流(有缓冲,缓冲满则写入磁盘)
此时写入的是最终的索引文件,格式如上
Spd文件
文件结构
//tQuery.m_eMode = SPH_MATCH_ANY;
tQuery.m_eMode = SPH_MATCH_BOOLEAN;
//tQuery.m_eMode = SPH_MATCH_PHRASE;
//tQuery.m_eMode = SPH_MATCH_EXTENDED;
//tQuery.m_eMode = SPH_MATCH_EXTENDED2;
//SPH_SORT_RELEVANCE 模式, 按相关度降序排列(最好的匹配排在最前面)
//SPH_SORT_ATTR_DESC 模式, 按属性降序排列(属性值越大的越是排在前面)
//SPH_SORT_ATTR_ASC模式, 按属性升序排列(属性值越小的越是排在前面)
//SPH_SORT_TIME_SEGMENTS 模式, 先按时间段(最近一小时/天/周/月)降序,再按
// 相关度降序
//SPH_SORT_EXTENDED 模式, 按一种类似SQL的方式将列组合起来,升序或降序排
// 列。
//SPH_SORT_EXPR 模式,按某个算术表达式排序。
switch ( pQuery->m_eMode )
{
case SPH_MATCH_ALL: bMatch = MatchAll ( pQuery, pResult, iSorters, ppSorters ); break;// 与查询
case SPH_MATCH_PHRASE: bMatch = MatchAll ( pQuery, pResult, iSorters, ppSorters ); break;//短语查询
case SPH_MATCH_ANY: bMatch = MatchAny ( pQuery, pResult, iSorters, ppSorters ); break; //或查询
case SPH_MATCH_BOOLEAN: bMatch = MatchBoolean ( pQuery, pResult, iSorters, ppSorters, tTermSetup ); break;//布尔查询
case SPH_MATCH_EXTENDED: bMatch = MatchExtendedV1 ( pQuery, pResult, iSorters, ppSorters, tTermSetup ); break;//扩展查询
case SPH_MATCH_EXTENDED2: bMatch = MatchExtended ( pQuery, pResult, iSorters, ppSorters, tTermSetup ); break;
case SPH_MATCH_FULLSCAN: bMatch = MatchFullScan ( pQuery, iSorters, ppSorters, tTermSetup ); break;
default: sphDie ( "INTERNAL ERROR: unknown matching mode (mode=%d)", pQuery->m_eMode );
}
ISphTokenizer * pTokenizer
// 用作解析的配置信息,例如字符集,切词规则(n-gram)
// 包括同义词,过滤词
1. pResult = pIndex->Query ( pTokenizer, pDict, &tQuery );
{
ISphMatchSorter * pTop = sphCreateQueue ( pQuery, m_tSchema, sError );(
pTop=newCSphMatchQueue> ( pQuery->m_iMaxMatches, bUsesAttrs ); //选择排序规则
)
2. if ( QueryEx ( pTokenizer, pDict, pQuery, pResult, pTop ) )
3. bool bRes = MultiQuery ( pTokenizer, pDict, pQuery, pResult, 1, &pTop );
4. case SPH_MATCH_BOOLEAN: bMatch = MatchBoolean ( pQuery, pResult, iSorters, ppSorters, tTermSetup );
CSphSource_XMLPipe2-XML文件获取数据
CSphSource_SQL-SQL(MySQL)获取数据
CSphIndex 索引器
派生类CSphIndex_VLN
// 索引过程
virtual int Build ( CSphDict * pDict,
const CSphVector
int iMemoryLimit, // 内存设置
ESphDocinfo eDocinfo );
/// available docinfo storage strategies
enum ESphDocinfo
{
SPH_DOCINFO_NONE = 0, ///< no docinfo available
SPH_DOCINFO_INLINE = 1, ///< inline docinfo into index (specifically, into doclists)
SPH_DOCINFO_EXTERN = 2 ///< store docinfo separately
};
BYTE ** CSphSource_SQL::NextDocument ( CSphString & sError )
{
m_tDocInfo.m_iDocID = sphToDocid ( SqlColumn(0) ); // 取得文档ID值
}
bool CSphSource_Document::IterateHitsNext ( CSphString & sError )
{
while ( ( sWord = m_pTokenizer->GetToken() )!=NULL ) //分词
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CSphAutofile fdTmpDocinfos ("tmp2") // 存储文档信息
DOCINFO2ID(pDocinfo) = pSource->m_tDocInfo.m_iDocID; // 自定义ID
memcpy ( DOCINFO2ATTRS(pDocinfo), pSource->m_tDocInfo.m_pRowitems, sizeof(CSphRowitem)*m_tSchema.GetRowSize() );
pDocinfo += iDocinfoStride;
Sphinx使用的文件包括 "sph", "spa", "spi", "spd", "spp", "spm" ,还有锁文件。其中sph是系统的配置文件。其它则为索引文件。
.Spi 文件:保存WordId及指向此WordId对应的文档信息在spd文件的指针。Spi文件在检索程序启动时完全加载入内存。Spi文件是分块的,块内排序,块之间也排序。分块的目的应该是为了快速检索到WordId,因为Spi中的WordId是变长压缩的,索引需要先在块级别做二分定位,再在快内解压缩查找。
文件结构,每块中结构,wordId实际存储的是差值
WordId | SpdFilePointer | DocNum | HitNum
.Spd文件:文件结构
DocID | [DocInfo] | HitFilePointer | FieldNum | HitNum
.Spp文件: 文件结构
HitPos
.Spa文件:存储DocInfo的文件,检索程序启动时会把此文件加载如内存,sphinx可以指定DocInfo的存储方式,
① 存储到spd文件中(InLine)
②. 另外单独存储。指定此,就会生成spa文件
文件结构:
DocId | DocInfo
.Spm文件:在DocInfo中,有一种特殊的属性,叫MVA,多值属性。Sphinx对此属性特殊处理,需要存储在spm文件中。检索程序启动时会把此文件加载如内存。此(MVA)属性在DocInfo对应位置存储其在此文件中的字节偏移量。
文件结构:
DocId | Anum,A1,A2,…,An | Bnum,B1,B2,…,Bn | …
由于在第一趟扫描过程中会出现WordID相同的不同Hits(不同文档或者不同位置不同字段),二趟前会根据WordID排序,WordID相同的Hits会连续出现并合并(合并到第一次出现的相同WordID中)
/////////////////////////////////////////////
Spi文件
// 遍历所有的数据源
// 遍历所有的文档
struct CSphWordHit
{
SphDocID_t m_iDocID; ///< document ID
SphWordID_t m_iWordID; ///< word ID in current dictionary
DWORD m_iWordPos; ///< word position in current document
};
CSphWordHit.. CSphWordHit…CSphWordHit…CSphWordHit串接
dHitBlocks.Add( cidxWriteRawVLB ( fdTmpHits.GetFD(), dHits, iHits, NULL, 0, 0 ) );//
GetIndexFileName("tmp1") 将Hits流写入tmp1文件。临时文件
不论重复,不论字段
dBins[i]->ReadHit(&tHit,iRowitems,dInlineAttrs+i*iRowitems )// 重新读入内存
cidxHit(tQueue.m_pData,iRowitems?dInlineAttrs+iBin*iRowitems : NULL );
// 统计后刷入m_wrWordlist,形如以下字节流(有缓冲,缓冲满则写入磁盘)
WordId | SpdFilePointer | DocNum | HitNum
此时写入的是最终的索引文件,格式如上
Spd文件
文件结构
DocID | [DocInfo] | HitFilePointer | FieldNum | HitNum
//tQuery.m_eMode = SPH_MATCH_ANY;
tQuery.m_eMode = SPH_MATCH_BOOLEAN;
//tQuery.m_eMode = SPH_MATCH_PHRASE;
//tQuery.m_eMode = SPH_MATCH_EXTENDED;
//tQuery.m_eMode = SPH_MATCH_EXTENDED2;
//SPH_SORT_RELEVANCE 模式, 按相关度降序排列(最好的匹配排在最前面)
//SPH_SORT_ATTR_DESC 模式, 按属性降序排列(属性值越大的越是排在前面)
//SPH_SORT_ATTR_ASC模式, 按属性升序排列(属性值越小的越是排在前面)
//SPH_SORT_TIME_SEGMENTS 模式, 先按时间段(最近一小时/天/周/月)降序,再按
// 相关度降序
//SPH_SORT_EXTENDED 模式, 按一种类似SQL的方式将列组合起来,升序或降序排
// 列。
//SPH_SORT_EXPR 模式,按某个算术表达式排序。
switch ( pQuery->m_eMode )
{
case SPH_MATCH_ALL: bMatch = MatchAll ( pQuery, pResult, iSorters, ppSorters ); break;// 与查询
case SPH_MATCH_PHRASE: bMatch = MatchAll ( pQuery, pResult, iSorters, ppSorters ); break;//短语查询
case SPH_MATCH_ANY: bMatch = MatchAny ( pQuery, pResult, iSorters, ppSorters ); break; //或查询
case SPH_MATCH_BOOLEAN: bMatch = MatchBoolean ( pQuery, pResult, iSorters, ppSorters, tTermSetup ); break;//布尔查询
case SPH_MATCH_EXTENDED: bMatch = MatchExtendedV1 ( pQuery, pResult, iSorters, ppSorters, tTermSetup ); break;//扩展查询
case SPH_MATCH_EXTENDED2: bMatch = MatchExtended ( pQuery, pResult, iSorters, ppSorters, tTermSetup ); break;
case SPH_MATCH_FULLSCAN: bMatch = MatchFullScan ( pQuery, iSorters, ppSorters, tTermSetup ); break;
default: sphDie ( "INTERNAL ERROR: unknown matching mode (mode=%d)", pQuery->m_eMode );
}
ISphTokenizer * pTokenizer
// 用作解析的配置信息,例如字符集,切词规则(n-gram)
// 包括同义词,过滤词
1. pResult = pIndex->Query ( pTokenizer, pDict, &tQuery );
{
ISphMatchSorter * pTop = sphCreateQueue ( pQuery, m_tSchema, sError );(
pTop=newCSphMatchQueue
)
2. if ( QueryEx ( pTokenizer, pDict, pQuery, pResult, pTop ) )
3. bool bRes = MultiQuery ( pTokenizer, pDict, pQuery, pResult, 1, &pTop );
4. case SPH_MATCH_BOOLEAN: bMatch = MatchBoolean ( pQuery, pResult, iSorters, ppSorters, tTermSetup );






