sphinx索引部分源码续——过程:连接到CSphSource对应的sql数据源,通过fetch row取其中一行,然后解析出field,分词,获得wordhit,最后再加入到CSphSource的Hits里

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介:

后面就是初始化一些存储结构,其中重点说下缓存出来的几个临时文件分别的作用。结尾时tmp0的存储的是被上锁的Index,有些Index正在被查询使用 故上锁。tmp1,即对应将来生成的spp文件,存储词汇的位置信息,包含该词所在的文档ID,该词所在词典对应的ID,以及该词在本文档中的位置信息。 tmp2,即对应将来生成的spa文件存储的是文档信息,包含了DocID以及DocInfo信息。tmp7对应的是多值查询,感兴趣的可以度娘,这是一 种查询方式,这里不做过多解释

1
2
3
4
5
6
7
// create temp files
     CSphAutofile fdLock ( GetIndexFileName( "tmp0" ), SPH_O_NEW, m_sLastError,  true  );
     CSphAutofile fdHits ( GetIndexFileName ( m_bInplaceSettings ?  "spp"  "tmp1"  ), SPH_O_NEW, m_sLastError, !m_bInplaceSettings );
     CSphAutofile fdDocinfos ( GetIndexFileName ( m_bInplaceSettings ?  "spa"  "tmp2"  ), SPH_O_NEW, m_sLastError, !m_bInplaceSettings );
     CSphAutofile fdTmpFieldMVAs ( GetIndexFileName( "tmp7" ), SPH_O_NEW, m_sLastError,  true  );
     CSphWriter tOrdWriter;
     CSphString sRawOrdinalsFile = GetIndexFileName( "tmp4" );

下面具体处理每一个Source取出的每一个文档,主要是通过这个IterateHitsNext实现的

具体到该函数可以看到,该函数主要是有两部分组成,即提取索引列(NextDocument),针对该索引列构建索引(BuildHits)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool  CSphSource_Document::IterateHitsNext ( CSphString & sError )
{
     assert  ( m_pTokenizer );
     PROFILE ( src_document );
     BYTE ** dFields = NextDocument ( sError );//从数据源中提取需要构建索引的列
     if  ( m_tDocInfo.m_iDocID==0 )
         return  true ;
     if  ( !dFields )
         return  false ;
     m_tStats.m_iTotalDocuments++;
     m_dHits.Reserve ( 1024 );
     m_dHits.Resize ( 0 );
     BuildHits ( dFields, -1, 0 );//针对提取出的需要索引的列构建索引
     return  true ;
}

具体看一下NexDocument的操作,通过Sql.h中的API——sqlFetchRow,取出一条记录,验证该记录是否合法

 

将条记录按照Schema分成Feild部分,即需要构建索引的部分,以及Attribute部分,即排序需要用到的属性部分

 

提取出相关数据后,针对每一条需要索引的item开始构建索引,进入BuildHit函数,首先先初始化相关参数,准备分词器缓存

然后开始分词,分词的过程在这里不具体讲了,这不属于Sphinx的主要涉足领域,当我们把iField即要索引的字段放入分词器中依次解析,然后将分出的词赋值给sWord,将sWord的位置计算后赋值给ipos

将分词后的sWord去词典中查找它对应的词ID,这样我们就收集全了这个词的所有详细信息,创建一个类型为CSphWordHit类型的tHit,其中存储了该sWord所在的DocID,在词典中对应的词ID,以及在文档中词的位置信息Pos

1
2
3
4
5
6
7
8
9
10
11
SphWordID_t iWord = m_pDict->GetWordID ( sWord );
                 if  ( iWord )
                 {
                     CSphWordHit & tHit = m_dHits.Add ();//将tHit放入dHit中去
                     tHit.m_iDocID = m_tDocInfo.m_iDocID;
                     tHit.m_iWordID = iWord;
                     tHit.m_iWordPos = iPos;
                 else
                 {
                     iLastStep = m_iStopwordStep;
                 }

处 理完该词后,如果是中文的话还会进一步去判断其是否有近义词出现,。。。,最后将所有的sWord的信息tHit都放入到m_dHits中去,形成我们的词 索引spp索引.

当该iField索引字段全部都索引完成后,在dHit中添加结束标记!

 

摘自:http://frankiewb.blog.51cto.com/8202664/1359897


















本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/6668015.html,如需转载请自行联系原作者

相关文章
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
167 9
|
2月前
|
深入探索数据库索引技术:回表与索引下推解析
【10月更文挑战第15天】在数据库查询优化的领域中,回表和索引下推是两个核心概念,它们对于提高查询性能至关重要。本文将详细解释这两个术语,并探讨它们在数据库操作中的作用和影响。
63 3
SQL优化-使用联合索引和函数索引
在一次例行巡检中,发现一条使用 `to_char` 函数将日期转换为字符串的 SQL 语句 CPU 利用率很高。为了优化该语句,首先分析了 where 条件中各列的选择性,并创建了不同类型的索引,包括普通索引、函数索引和虚拟列索引。通过对比不同索引的执行计划,最终确定了使用复合索引(包含函数表达式)能够显著降低查询成本,提高执行效率。
如何确认SQL用了索引:详细技巧与方法
在数据库管理中,索引是提高SQL查询性能的重要手段
SQL默认索引是什么:深入解析与技巧
在SQL数据库中,索引是一种用于提高查询性能的重要数据结构
SQL默认索引是什么
在SQL数据库中,索引是一种用于提高查询性能的数据结构
如何确认SQL用了索引
在数据库管理和优化过程中,确认SQL查询是否使用了索引是一个至关重要的步骤
如何确认SQL查询是否使用了索引:详细步骤与技巧
在数据库管理和优化中,确认SQL查询是否有效利用了索引是提升性能的关键步骤
|
3月前
|
SQL_创建和管理索引
SQL_创建和管理索引
33 0
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
107 2

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等