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

    CSphSource 数据源

    CSphSource_XMLPipe2-XML文件获取数据

    CSphSource_SQL-SQL(MySQL)获取数据

    CSphIndex 索引器

    派生类CSphIndex_VLN

    // 索引过程

    virtual int Build ( CSphDict * pDict,

    const CSphVector<CSphSource*> & dSources, // 所有数据源

    int iMemoryLimit, // 内存设置

     ESphDocinfo eDocinfo );

    sphinx dSource是一个CSphSource的数组,每一个CSphSource类型的pSource对应一个数据源,因为配置信息中可能会存在多个数据源,所以会有多个pSource。程序会在hIndex中搜索Key值为Source的键值对,提取出对应的值作为pSourceName ,在本例中,我们只有配置文件中的一个Source即mysql。我们看一下CSphSource类型结构。其中包含有三个大部分,第一大部分存储文本分词后的word信息,每一个word(也许是字也许是词)对应一个WordHit,这个WordHit描述该word的相关信息,唯一标示该word。其 中WordHit中又包含三部分,分别为word的文档ID,表示该word属于哪一篇文档;word的ID,表示该word在字典中的对应 ID;Word的位置,表示该word在文档中的偏移量。第二大部分存储Source中文档的相关信息,其中亦包含了三部分,分别为文档ID、文档中列的 数目,以及列对应的指针。第三大部分存储的就是doc中的属性字段信息。

    1
    2
    3
    4
    5
    6
    7
    /// generic data source
    class CSphSource : public CSphSourceSettings
    {
    public:
        CSphVector<CSphWordHit>               m_dHits;    ///< current document split into words
        CSphDocInfo                         m_tDocInfo; ///< current document info
        CSphVector<CSphString>                m_dStrAttrs;///< current document string attrs
     

    Source 信息准备好后,开始准备Index的构建工作,首先检测该Index是否被使用,即是否被上锁,其次通过CSphIndexSettings类型的 tSettings对创建好的pIndex进行初始化,主要是一些索引构建的信息,例如缓存大小,Boudary大小,停用词初始化,分词器初始化等等。 准备完相关信息后,重要的就是Build函数,这是索引构建的核心函数

     

    对于Build函数而言,它是单次处理一个数据源并为此构建索引信息

    //sphinx.cpp Build ( const CSphVector<CSphSource*> & dSources, int iMemoryLimit, int iWriteBuffer )

    首先是准备Source,还是把dSource中的每一个pSource检查下是否都存在,词典是否都准备好,各种初始化是否都齐备

     

    链接第一个数据源,获取数据源的Schema信息,就是数据源的Doc中哪些是属性,哪些列是要构建索引的信息

    1
    2
    3
    4
    5
    6
    7
    // connect 1st source and fetch its schema
        if ( !dSources[0]->Connect ( m_sLastError )
            || !dSources[0]->IterateHitsStart ( m_sLastError )
            || !dSources[0]->UpdateSchema ( &m_tSchema, m_sLastError ) )
        {
            return 0;
        }

    本文出自 “博の客” 博客,请务必保留此出处http://frankiewb.blog.51cto.com/8202664/1359897

  • 相关阅读:
    Educational Codeforces Round 69 D E
    洛谷P2325 [SCOI2005]王室联邦
    洛谷P1494 [国家集训队]小Z的袜子
    洛谷P4514 上帝造题的七分钟
    POJ3321Apple Tree
    满血复活前的记录(持续更新ing)
    各位2019见
    LuoguP3338 [ZJOI2014]力
    Codeforces Round #478 Div2 975A 975B 975C 975D
    Codeforces Round #479 (Div. 3) 题解 977A 977B 977C 977D 977E 977F
  • 原文地址:https://www.cnblogs.com/bonelee/p/6667955.html
Copyright © 2011-2022 走看看