참고: 스핑크스의 증분 인덱스는 실제로 두 개의 인덱스를 통해 구현됩니다(메인 인덱스는 매일 아침 업데이트되고, 증분 인덱스는 5분마다 생성됩니다). 인터넷에서는 인덱스를 통해 하나의 인덱스로 병합할 수 있다고 합니다. 병합을 시도했지만
sphinx 증분 인덱스 설정에서 실제로 병합되지 않았습니다.
데이터베이스에 있는 기존 데이터는 매우 크고, 새로운 데이터가 지속적으로 데이터베이스에 추가되고 있는데, 이를 검색할 수 있기를 바랍니다. 업데이트해야 하는 데이터가 상대적으로 작기 때문에 전체 재인덱싱에는 비용이 많이 듭니다.
예를 들어. 수백만 개의 원본 데이터가 있었지만 새로운 데이터는 수천 개에 불과했습니다. 이러한 방식으로 "기본 인덱스 + 증분 인덱스" 모드를 사용하여 거의 실시간 업데이트 기능을 달성할 수 있습니다.
이
이 모드를 구현하는 기본 원칙은 2개의 데이터 소스와 2개의 인덱스를 설정하고, 기본적으로 업데이트되지 않는 데이터와 신규 데이터에 대해 메인 인덱스를 설정하는 것입니다.
증분 데이터에 대한 증분 인덱스를 만듭니다. 기본 인덱스의 업데이트 빈도는 더 길게 설정할 수 있으며(예: 매일 자정에 설정), 증분 인덱스의 업데이트 빈도는 매우 짧게(몇 분 정도) 설정할 수 있습니다.
맞아) 그래야 사용자가 검색할 때 이 두 인덱스의 데이터를 동시에 쿼리할 수 있다.
"메인 인덱스 + 증분 인덱스" 방식을 사용하는 간단한 구현이 있습니다. 데이터베이스에 카운팅 테이블을 추가하여 메인 인덱스가 재구축될 때마다 인덱싱된 테이블의 마지막 데이터 ID를 기록하므로 증분 인덱스에 이 ID 이후의 데이터만 인덱싱하고 기본 인덱스가 다시 빌드될 때마다 이 테이블을 업데이트하면 됩니다.
테스트 조건: 기본 sphinx.conf 구성을 예로 사용하고, 데이터베이스 테이블 데이터도 example.sql을 예로 사용합니다.
1. 관련 테이블 생성
创建主索引表 CREATE TABLE `sph_test1` ( `id` int(10) unsigned NOT NULL, `weight` int(11) NOT NULL, `query` varchar(3072) CHARACTER SET latin1 NOT NULL, `group_id` int(11) DEFAULT NULL, KEY `query` (`query`) ) ENGINE=SPHINX DEFAULT CHARSET=utf8 CONNECTION='sphinx://127.0.0.1:9312/test1' 创建索引计数表 CREATE TABLE `sph_counter` ( `id` int(11) NOT NULL, `max_doc_id` int(11) NOT NULL, PRIMARY KEY (`id`) ) 创建增量索引表 CREATE TABLE `sph_delta_test1` ( `id` int(10) unsigned NOT NULL, `weight` int(11) NOT NULL, `query` varchar(3072) NOT NULL, `group_id` int(11) DEFAULT NULL, KEY `query` (`query`(1024)) ) ENGINE=SPHINX DEFAULT CHARSET=utf8 CONNECTION='sphinx://127.0.0.1:9312/delta_test1'
2. sphinx.conf 수정
source src1{ type = mysql sql_host = localhost sql_user = yourusername sql_pass = yourpassword sql_db = test //你所用的数据库 sql_port = 3306 //所用端口,默认是3306 sql_query_pre = SET NAMES utf8 sql_query_pre = sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM documents 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 ) } // 注意:delta_src 中的sql_query_pre的个数需和main_src 对应,否则可能搜索不出相应结果 source delta_src1: src1{ sql_ranged_throttle = 100 sql_query_pre = SET NAMES utf8 sql_query_pre = SET SESSION query_cache_type=OFF 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 ) } index test1 //主索引{ source = src1 path = /usr/local/sphinx/var/data/test1 charset_type = utf-8 #这个是支持中文必须要设置的 chinese_dictionary =/usr/local/sphinx/etc/xdict #..........其它可以默认 } index delta_test1: src1 //增量索引{ source = delta_src1 path = /usr/local/sphinx/var/data/delta_src1 }
3. 서비스를 다시 시작하지 않고도 인덱스가 적용됩니다.
a. 이른 아침마다 전체 인덱스 생성: ./indexer test1 --rotate
b. 10분마다 증분 인덱스 생성: ./ 인덱서 delta_test1 --rotate