思路,数据每时每刻在增加,然后不可能每次都重新加载索引,如果数据特别大占用cpu和性能。

1.用一个计数器,记住每天这张表最大的ID值,

2.用增量索引,没5分钟增加增量索引,保证sphinx实时能搜索到,减少数据延时性。

3.每天更新主索引

实现方法

先弄个计数器

CREATE TABLE `sph_counter` (
  `count_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `max_doc_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`count_id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
#MySQL数据源配置,详情请查看:http://www.coreseek.cn/products-install/mysql/
#请先将var/test/documents.sql导入数据库,并配置好以下的MySQL用户密码数据库

#源定义
source mysql
{
    type                    = mysql

    sql_host                = localhost
    sql_user                = root
    sql_pass                = 123456
    sql_db                  = test
    sql_port                = 3306
    sql_query_pre           = SET NAMES utf8
    
    sql_query_pre = replace into sph_counter select 1,max(id) from  documents
     #预先处理计数器表Id
    sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added,                                     title, content FROM documents
      where id<=(select max_doc_id from sph_counter where counter_id=1 )
        
     #sql_query第一列id需为整数
      #title、content作为字符串/文本字段,被全文索引
                              
    #####以下是用来过滤或条件查询的属性,这里列出的字段将可以进行条件查询,同时不参与全文检索############  
    sql_attr_uint           = group_id           #从SQL读取到的值必须为整数
    sql_attr_timestamp      = date_added #从SQL读取到的值必须为整数,作为时间属性
    #sql_attr_float   
    #sql_attr_string   
    
    sql_query_info_pre      = SET NAMES utf8                                        #命令行查询时,设置正确的字符集
    sql_query_info          = SELECT * FROM documents WHERE id=$id #命令行查询时,从数据库读取原始数据信息
}

#增量数据源
source delta : mysql
{
    sql_query_pre=set names utf8
    sql_query=SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents 
        where id>(select max_doc_id from sph_counter where count_id = 1)
}




#index定义
index mysql
{
    source           = mysql             #对应的source名称
    path             = F:/mysql/sphinx/documents/ #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    docinfo          = extern
    mlock            = 0
    morphology       = none
    min_word_len     = 1
    html_strip       = 1

    #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
    #charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾
    charset_dictpath  = F:/mysql/coreseek-3.2.14-win32/etc/       #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
    charset_type      = zh_cn.utf-8
}

#增量索引
index delta : mysql
{
    source=delta  
        path  = F:/mysql/sphinx/delta/
#       path    = /usr/local/coreseek/var/data/delta
#    morphology        = stem_en
}

#全局index定义
indexer
{
    mem_limit            = 128M
}

#searchd服务定义
searchd
{
   # compat_sphinxql_magics = 0
    listen                  = 9312
    read_timeout            = 5
    max_children            = 30
    max_matches             = 1000
    seamless_rotate         = 0
    preopen_indexes         = 0
    unlink_old              = 1
                
    pid_file = F:/mysql/coreseek-3.2.14-win32/var/log/searchd_mysql.pid   #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    log = F:/mysql/coreseek-3.2.14-win32/var/log/searchd_mysql.log        #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    query_log = F:/mysql/coreseek-3.2.14-win32/var/log/query_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    #binlog_path =                                #关闭binlog日志
}

注意:在Centos7中PHP7环境中preopen_indexesseamless_rotate要设置成1 要不在php代码query执行查询多个索引的时候会报错、官方给的例子是只能设置一个

Example:
seamless_rotate = 1
sphinx索引文件的打开也有两种模式:

preopen_indexes = 0 or 1

限于sphinx索引滚动的实现方式,sphinx的索引滚动与索引文件的preopen有一些冲突的地方,既preopen_indexes=1 has no effect with seamless_rotate=0

linux下 用即时任务实时更新

第一个主索引msyql脚本

#!/bin/bash
 /usr/local/coreseek/bin/inderer mysql --rotate >>/usr/local/coreseek/var/log/mysql.log

第二个增量索引delta脚本

#!/bin/bash
/usr/local/coreseek/bin/inderer delta --rotate >>/usr/local/coreseek/var/log/delta.log

即时任务crontab -e 然后将这两个脚本放在linux定时任务器每5分钟执行一次增量索引,每天3天执行以下主索引

*/5 * * * * /usr/local/coreseek/init/delta.sh
00 03 * * * /usr/local/coreseek/init/main.sh

分布式索引的配置

index dist{
  type=distributed
  local =chunk1 
  agent =localhost:9312:chunk2 
  #本地:的9312端口的:chunk2 数据源(source)   
  agent =192.168.100.2:9312:chunk3 #远程索引
  agent =192.168.100.3:9312:chunk4  #远程索引
}
Last modification:January 5, 2020
如果觉得我的文章对你有用,请随意赞赏