2012-08-09 4 views
2

현재 2 천만 건 이상의 레코드가있는 MySQL 쿼리를 인덱싱하는 데 Sphinx를 사용하고 있습니다.스핑크스 주/델타 인덱싱, sql_query_killlist

델타 색인을 사용하여 기본 색인을 업데이트하고 모든 새 레코드를 추가하고 있습니다.

불행히도 테이블에 대한 변경 사항은 삭제됩니다.

sql_query_killlist를 사용하여 삭제하거나 업데이트해야하는 모든 문서 ID를 가져올 수 있다는 것을 알고 있습니다. 불행히도 이것이 실제로 어떻게 작동하는지 이해하지 못하고 스핑크스의 문서에는 이해할 수있는 좋은 예가 없습니다.

다음 예제를 사용하면 어떻게 killlist를 구현할 수 있습니까? sphinx.conf에서 MySQL을

CREATE TABLE sph_counter 
(
    counter_id INTEGER PRIMARY KEY NOT NULL, 
    max_doc_id INTEGER NOT NULL 
); 

에서

다른 모든 설정은 기본, 에서 복사되지만 소스와 경로가 무시되는 방법

source main 
{ 
    # ... 
    sql_query_pre = SET NAMES utf8 
    sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM documents 
    sql_query = SELECT id, title, body FROM documents \ 
     WHERE id<=(SELECT max_doc_id FROM sph_counter WHERE counter_id=1) 
} 

source delta : main 
{ 
    sql_query_pre = SET NAMES utf8 
    sql_query = SELECT id, title, body FROM documents \ 
     WHERE id>(SELECT max_doc_id FROM sph_counter WHERE counter_id=1) 
} 

인덱스 주요

{ 
    source = main 
    path = /path/to/main 
    # ... all the other settings 
} 

노트 (그들은 반드시) 색인 델타 : 주

{ 
    source = delta 
    path = /path/to/delta 
} 
+0

문서 테이블에서 업데이트하고 삭제할 항목이 있습니까? 그것 없이는 킬리스트를 구현하기가 어렵습니다. – Imraan

답변

5

자세한 내용은 삭제 된 문서를 표시하는 방법에 따라 크게 달라질 수 있습니다. 그러나 단지 상태가 = '삭제'및 ID < =이 문서의

sql_query_killist = SELECT ID 같은 것을 추가합니다 (sph_counter로부터 max_doc_id을 선택 WHERE counter_id = 1) 델타 인덱스

. 그러면 주 색인에있는 삭제 된 레코드의 ID를 캡처하여 킬리스트에 추가하여 검색 결과에 나타나지 않게 할 수 있습니다.

업데이트 된 레코드를 캡처하려면 델타의 기본 sql_query에 포함될 새 행과 킬들 목록에있는 해당 ID를 정렬해야합니다.

+0

안녕하세요 배리. 테이블에서 삭제 된 경우 어떻게 할 수 있습니까? –

+0

글쎄요, 정말로 일종의 상태 플래그를 변경하는 것보다 '삭제'하면됩니다. 그런 다음 삭제 된 문서 목록을 얻는 다른 방법이 필요합니다. 응용 프로그램에서 문서를 삭제하면 새 테이블에 ID를 삽입 할 수 있습니다. 그리고 그것을 사용합니까? – barryhunter

+0

나에게 배리, 고마워. 주 테이블에서 삭제 된 모든 ID로 구성된 테이블을 추가 할 예정입니다. 내 kill-list에 대해 select * 테이블에서 할 수 있습니다. 행이 실제로 색인에서 삭제 되나요? 아니면 그냥 무시? –