共计 2825 个字符,预计需要花费 8 分钟才能阅读完成。
有这么一种常见的情况:整个数据集非常大,以至于难于经常性的重建索引,但是每次新增的记录却相当地少。一个典型的例子是:一个论坛有 1000000 个已经归档的帖子,但每天只有 1000 个新帖子。
在这种情况下可以用所谓的“主索引+增量索引”(main+delta)模式来实现“近实时”的索引更新。
这种方法的基本思路是设置两个数据源和两个索引,对很少更新或根本不更新的数据建立主索引,而对新增文档建立增量索引。在上述例子中,那 1000000 个已经归档的帖子放在主索引中,而每天新增的 1000 个帖子则放在增量索引中。增量索引更新的频率可以非常快,而文档可以在出现几分种内就可以被检索到。
确定具体某一文档的分属那个索引的分类工作可以自动完成。一个可选的方案是,建立一个计数表,记录将文档集分成两部分的那个文档 ID,而每次重新构建主索引时,这个表都会被更新。
第一步要先创建增量索引表 sph_counter
CREATE TABLE sph_counter
(counter_id INTEGER PRIMARY KEY NOT NULL,
max_doc_id INTEGER NOT NULL
);
第二步:修改原来的索引配置
source mysql
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass = mfy
sql_db = zlk
sql_port = 3306
sql_query_pre = SET NAMES utf8
# 下面 2 行是新增的内容
sql_query_pre = REPLACE INTO sph_counter SELECT 1,MAX(id) FROM picture_info
sql_query = SELECT * FROM picture_info \
WHERE id<=(SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
# 这还是以前 sql_query 现在已经不用了 sql_query = SELECT id,pic_id,city,captionwriter,countryname,title,description,contenttype,generator,author,keyword,language,datecreatedline FROM picture_info
#sql_query 第一列 id 需为整数
#title、content 作为字符串 / 文本字段,被全文索引
# sql_attr_uint = id #从 SQL 读取到的值必须为整数
sql_attr_uint = pic_id # 从 SQL 读取到的值必须为整数
sql_attr_timestamp = datecreatedline # 从 SQL 读取到的值必须为整数,作为时间属性
# sql_attr_str2ordinal = title
}
source delta:mysql
{# 这里是新增的增量索引源
sql_query_pre = SET NAMES utf8
sql_query = SELECT * FROM picture_info \
WHERE id>(SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
sql_query_post_index = replace into sph_counter select 1,max(id) from picture_info
}
#index 定义
index mysql
{source = mysql # 对应的 source 名称
path = /usr/local/coreseek/var/data/mysql
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
min_infix_len =1
html_strip = 0
charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux 环境下设置,/ 符号结尾
#charset_dictpath = etc/ #Windows 环境下设置,/ 符号结尾
charset_type = zh_cn.utf-8
}
index delta:mysql
{# 这是新增的增量索引
source = delta
path = /usr/local/coreseek/var/data/delta
}
# 全局 index 定义
indexer
{mem_limit = 2G
}
searchd
{listen = 9312
max_matches = 10000
pid_file = /usr/local/coreseek/var/log/searchd_mysql.pid
log = /usr/local/coreseek/var/log/searchd_mysql.log
query_log = /usr/local/coreseek/var/log/query_mysql.log
}
里面用红色标记的是新增或者有改动的地方。
执行索引:/usr/local/coreseek/bin/indexer -c /var/htdocs/zlk/sphinx/mysql.conf –all –rotate
执行增量索引:/usr/local/coreseek/bin/indexer -c /var/htdocs/zlk/sphinx/mysql.conf delta –rotate
合并索引:/usr/local/coreseek/bin/indexer -c /var/htdocs/zlk/sphinx/mysql.conf –merge mysql delta –rotate –merge-dst-range deleted 0 0
写两个脚本一个是执行增量索引并合并索引的另一个是重建索引的。
delta.sh: 执行增量索引并合并索引
#!/bin/sh
/usr/local/coreseek/bin/indexer -c /var/htdocs/zlk/sphinx/mysql.conf delta --rotate
/usr/local/coreseek/bin/indexer -c /var/htdocs/zlk/sphinx/mysql.conf --merge mysql delta --rotate --merge-dst-range deleted 0 0
main.sh:重建索引
#!/bin/sh
/usr/local/coreseek/bin/indexer -c /var/htdocs/zlk/sphinx/mysql.conf --all --rotate
最后写个计划任务每隔一分钟执行一遍 delta.sh 每天 12:30 执行 main.sh
执行命令:crontab -e
写入下面两行
1 * * * * /var/htdocs/zlk/sphinx/delta.sh
30 1 * * * /var/htdocs/zlk/sphinx/main.sh
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-05/143601.htm