>php教程 >PHP源码 >스핑크스 증분 인덱스 구현 예

스핑크스 증분 인덱스 구현 예

大家讲道理
大家讲道理원래의
2016-11-08 14:28:481160검색

참고: 스핑크스의 증분 인덱스는 실제로 두 개의 인덱스를 통해 구현됩니다(메인 인덱스는 매일 아침 업데이트되고, 증분 인덱스는 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


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.