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

    后面就是初始化一些存储结构,其中重点说下缓存出来的几个临时文件分别的作用。结尾时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

  • 相关阅读:
    (Java随机数举例)随机扔一千次硬币的正反次数
    hibernate+spring的整合思路加实例(配图解)
    从零开始学C++之IO流类库(三):文件的读写、二进制文件的读写、文件随机读写
    ssh连接Linux自动断开后再也无法连上的问题
    面试题10:二进制中1的个数
    C 语言统计关键字出现次数
    在Eclipse中Attach Source
    Visual Sudio 2012转换界面风格
    java 判断字符串IP合法性以及获取IP的数值形式
    java.lang.string split 以点分割字符串无法正常拆分字符串
  • 原文地址:https://www.cnblogs.com/bonelee/p/6668015.html
Copyright © 2011-2022 走看看