• sphinx增量索引教程(3)


    本节说增量索引,

       首先我们要先做一个实时索引更新的功能,然后要把实时索引合并到主索引上面。

    1.实时索引更新

      

    有这么一种常见的情况:整个数据集非常大,以至于难于经常性的重建索引,但是每次新增的记录却相当地少。一个典型的例子是:一个论坛有1000000个已经归档的帖子,但每天只有1000个新帖子。

    在这种情况下可以用所谓的“主索引+增量索引”(main+delta)模式来实现“近实时”的索引更新。

    这种方法的基本思路是设置两个数据源和两个索引,对很少更新或根本不更新的数据建立主索引,而对新增文档建立增量索引。在上述例子中,那1000000个已经归档的帖子放在主索引中,而每天新增的1000个帖子则放在增量索引中。增量索引更新的频率可以非常快,而文档可以在出现几分种内就可以被检索到。

    确定具体某一文档的分属那个索引的分类工作可以自动完成。一个可选的方案是,建立一个计数表,记录将文档集分成两部分的那个文档ID,而每次重新构建主索引时,这个表都会被更新。

    sphinx.conf 配置

    # in MySQL
    CREATE TABLE sph_counter
    (
        counter_id INTEGER PRIMARY KEY NOT NULL,
        max_doc_id INTEGER NOT NULL
    );
    
    # in sphinx.conf
    source main
    {
        # ...
        sql_query_pre = SET NAMES utf8
        sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM documents
        sql_query = SELECT id, title, body FROM documents 
            WHERE id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
    }
    
    source delta : main
    {
        sql_query_pre = SET NAMES utf8
        sql_query = SELECT id, title, body FROM documents 
            WHERE id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
    }
    
    index main
    {
        source = main
        path = /path/to/main
        # ... all the other settings
    }
    
    # note how all other settings are copied from main,
    # but source and path are overridden (they MUST be)
    index delta : main
    {
        source = delta
        path = /path/to/delta
    }
    

      请注意,上例中我们显示设置了数据源delta的sql_query_pre选项,覆盖了全局设置。必须显示地覆盖这个选项,否则对delta做索引的时候也会运行那条REPLACE查询,那样会导致delta源中选出的数据为空。可是简单地将delta的sql_query_pre设置成空也不行,因为在继承来的数据源上第一次运行这个指令的时候,继承来的所有值都会被清空,这样编码设置的部分也会丢失。因此需要再次显式调用编码设置查询。

    2.索引合并

    合并两个已有的索引比重新对所有数据做索引更有效率,而且有时候必须这样做(例如在“主索引+增量索引”分区模式中应合并主索引和增量索引,而不是简单地重新索引“主索引对应的数据)。因此indexer有这个选项。合并索引一般比重新索引快,但在大型索引上仍然不是一蹴而就。基本上,待合并的两个索引都会被读入内存一次,而合并后的内容需要写入磁盘一次。例如,合并100GB和1GB的两个索引将导致202GB的IO操作(但很可能还是比重新索引少)

    基本的命令语法如下:

    indexer --merge main delta
    

    当searchd服务开启的时候 使用上面的命令是会报错的、所以在后面加上 --rotate 

    indexer --merge main delta --rotate
    

      delta的内容被合并到main中,因此只有main索引会被改变。最初设计的使用模式是,将小量的更新从SRCINDEX合并到DSTINDEX中。 因此,当属性被合并时,一旦出现了重复的文档ID,SRCINDEX中的属性值更优先(会覆盖DSTINDEX中的值)。 不过要注意,“旧的”关键字在这个过程中并不会被自动删除。 例如,在DSTINDEX中有一个叫做“old”的关键字与文档123相关联,而在SRCINDEX中则有关键字“new”与同一个文档相关,那么在合并后用这两个关键字都能找到文档123。 您可以给出一个显式条件来将文档从DSTINDEX中移除,以便应对这种情况,相关的开关是–merge-dst-range:

    indexer --merge main delta --merge-dst-range deleted 0 0
    

      这个开关允许您在合并过程中对目标索引实施过滤。过滤器可以有多个,只有满足全部过滤条件的文档才会在最终合并后的索引中出现。在上述例子中,过滤器只允许“deleted”为0的那些条件通过,而去除所有标记为已删除(“deleted”)的记录

    去旧(强行更新):
    情景描述:假设有一旧关键字“去钓鱼”,与论坛贴子“周末的活动”相关联,用“去钓鱼”可以搜索到这篇帖子。之后楼主把贴子关键字部分改成了“去河边钓鱼”。如果用sphinx的indexer生成增量索引delta,然后用
    indexer --merge main delta --rotate 
    

     合成到主索引main后。用“去河边钓鱼”搜不到结果,用“去钓鱼”可以搜到“去河边钓鱼”的结果。

    解决办法:加--merge-killists option(选项)
    indexer --merge main delta --rotate --merge-killists   
    

      

  • 相关阅读:
    使用KNN算法手写体识别
    os内置模块
    python步长为负时的情况
    qplot()函数的详细用法
    python文件I/O
    python中 @property
    python中定制类
    python中多重继承与获取对象
    python继承,判断类型,多态
    python中访问限制
  • 原文地址:https://www.cnblogs.com/tong775131501/p/6023542.html
Copyright © 2020-2023  润新知