안내: 저는 PHP 초보자이고, 회사의 업무도 복잡하지 않지만, 최근에 전체 텍스트 검색을 사용하게 되어서 스핑크스를 사용하고 싶습니다.
대략 세 부분으로 나누어집니다. 1: 설치 2: API 호출 3. 여기서는 주로 구성 및 API 호출에 대해 설명합니다. 이전에 설치 단계에 대해 별도의 게시물을 작성했는데 이해가 되지 않으면 공식 웹사이트로 이동하여 더 이상 고민하지 말고 시작해 보세요.
1. 증분 인덱스를 사용하는 이유는 무엇인가요? 사실 저는 개인적으로 데이터량이 적은 기업에서는 증분형 인덱스를 사용하는 것이 전혀 불필요하다고 생각합니다. 정기적으로 인덱스를 재생성할 수 있으면 괜찮습니다. 증분 인덱싱은 마지막 생성된 인덱스 이후 추가된 콘텐츠에 대해 별도의 인덱스를 생성하여 데이터의 양이 상대적으로 적고 업무 처리에 영향을 미치지 않도록 하는 것입니다. 그런 다음 인덱스를 정기적으로 병합하여 데이터 균일성을 유지해야 합니다. 정기적으로 재생성됩니다.
1. 마지막으로 생성된 인덱스의 ID를 기록해야 하며 테이블에 저장할 수 있습니다.
CREATE TABLEtbl_pre_coursevideo( idint(11) NOT NULL DEFAULT '0', maxidint(11) NOT NULL DEFAULT '0', PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2. 구성 파일
source mysql { type = mysql sql_host = 127.0.0.1 sql_user = root sql_pass = 123456 sql_db = test sql_port = 3306 sql_query_pre = SETNAMES utf8 sql_query_pre = SETSESSION query_cache_type=OFF #如果这里报错去mysql配置文件修改 sql_query_pre = REPLACEINTO tbl_pre_coursevideo SELECT1, MAX(id) FROM tbl_coursevideo #在刚才新建的表中将当前索引生成的最多id存起来,为增量索引做准备。 sql_query = SELECT id,title,create_time, subtitle,content,type FROM tbl_coursevideo WHERE id <=(SELECT maxid FROM tbl_pre_coursevideo WHERE id=1) #上面这条sql可以分为两部分WHERE 之前,是对数据的查询(根据自己的业务来定)where之后,是对刚才的记录 最大ID 的筛选 sql_attr_uint = id #从SQL读取到的值必须为整数 sql_attr_timestamp = create_time #从SQL读取到的值必须为整数,作为时间属性 sql_field_string = title #字符串字段(可全文搜索,可返回原始文本信息) sql_field_string = subtitle #字符串字段(可全文搜索,可返回原始文本信息) sql_field_string = content #字符串字段(可全文搜索,可返回原始文本信息) } source increment : mysql { sql_query_pre = SETNAMES utf8 sql_query = SELECT id,title,create_time, subtitle,content,type FROMtbl_coursevideo WHERE id >(SELECT maxid FROM tbl_pre_coursevideo WHERE id=1) #这是增量索引的数据源sql。和上面保持一致,唯一的变化,就是where条件之后,这里查询的是大于上次重新生成索引的id,即:刚刚添加的数据 } #index定义 index mysql { source = mysql #对应的source名称 path = /usr/local/coreseek/var/data/mysql#请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... docinfo = extern mlock = 0morphology = none min_word_len = 1html_strip = 0 #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/ charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾 #charset_dictpath = etc/ #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/... charset_type = zh_cn.utf-8} index increment : mysql { source=increment path = /usr/local/coreseek/var/data/increment charset_dictpath = /usr/local/mmseg3/etc/ charset_type = zh_cn.utf-8} #全局index定义 indexer { mem_limit = 128M } #searchd服务定义 searchd { listen = 9312read_timeout = 5max_children = 30max_matches = 1000seamless_rotate = 0preopen_indexes = 0unlink_old = 1 pid_file = /usr/local/coreseek/var/log/searchd_mysql.pid #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... log =/usr/local/coreseek/var/log/searchd_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... query_log =/usr/local/coreseek/var/log/query_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... }
사용:
1. 아래 명령은 모두 제가 직접 설치한 환경 경로입니다. 직접 수정하세요) /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --all
#색인생성
이때 tbl_pre_coursevideo 테이블에 레코드가 추가됩니다. 저장되는 것은 콘텐츠 테이블의 최대 id
2, /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft.conf
#백그라운드 프로세스 열기
이때 mysql 데이터소스를 검색해보면 실제로는 데이터.
3. 증분 인덱스(콘텐츠 테이블에 새 데이터를 추가하기 위한 전제 조건) /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf increment --rotate
#실행이 완료되면 조각 수인 증분 인덱스 데이터를 여러 개 생성하라는 메시지가 표시됩니다. 방금 콘텐츠 테이블에 추가한 데이터입니다. 이때 실제로 증분 인덱스가 성공했는지 여부를 테스트할 수 있습니다. cl->Query($keyword, 'increment') api 호출 시 방금 추가한 내용을 증분 인덱스를 이용하여 쿼리할 수 있습니다
4. 인덱스 병합
usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf
–merge mysql increment –rotate
cl->Query('查询的关键字', 'mysql'); //就能查询出来刚才的新添加的数据,以及以前的数据。
5. 데이터 균일성을 유지하려면 정기적으로 인덱스를 재생성해야 합니다
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --all --rotate#--rotate 是不影响服务器搜索时可以添加这个属性
1. API를 호출합니다. 설치 후 sphinxapi.php 파일에 이 클래스가 있습니다.
require'sphinxapi.php'; class Sphinx {private$host='127.0.0.1';private$port=9312;private$cl;/* * @desc 构造函数 初始化sphinx对象 */public function __construct() {$this->cl =new SphinxClient ();$this->cl->SetServer($this->host, $this->port);$this->cl->SetConnectTimeout(1);$this->cl->SetArrayResult(true);$this->cl->SetMatchMode(SPH_MATCH_EXTENDED2);$this->cl->SetRankingMode(SPH_RANK_WORDCOUNT); }/* * @desc 搜索 * @param $page 页数 * @param $pagesize 条数 * @param $keyword 搜索关键字 * @param $source 索引源 */public function search($keyword, $p, $pagesize) {$page= ($p-1) *10;$this->cl->SetLimits($page, $pagesize); //分页$res=$this->cl->Query($keyword, $source); //sphinx 查询 } }
yum install crontab //Install
crontab - e //편집을 위해 열기
그런 다음 정기적으로 증분 인덱싱을 실행하고 인덱스를 병합하고 인덱스를 다시 생성합니다.
path = /usr/local/coreseek/var/data/increment#这里的配置,主索引是否和增量索引这只的路径一样,increment 就是索引的文件名,会在data文件夹下。