2012-11-30 2 views
0

쿼리의 올바른 방법 :스핑크스 쿼리 - 나는 MySQL의 쿼리를 사용하고 내 응용 프로그램에서

SELECT DISTINCT * FROM forum_topic \ 
     LEFT JOIN forum_post ON forum_post.id_topic = forum_topic.Id \ 
      WHERE MATCH (forum_post.content) AGAINST ('searching text') \ 
     AND !MATCH (forum_topic.topic_name) AGAINST ('searching text') \ 
     GROUP BY forum_topic.Id 

하지만 지금은 스핑크스로 마이그레이션 할. DB에서 config 파일과 테이블 sph_counter를 생성했습니다. 이제 내 설정은 다음과 같습니다.

source main 
{ 
    type   = mysql 
    sql_host  = localhost 
    sql_user  = root 
    sql_pass  = 
    sql_db   = sphinx 
    sql_port  = 3306 # optional, default is 3306 
     sql_query_pre = SET NAMES utf8 
     sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(Id) FROM forum_post 
     sql_query = SELECT * FROM forum_topic LEFT JOIN forum_post ON forum_post.id_topic = forum_topic.Id \ 
      WHERE forum_post.Id<=(SELECT max_doc_id FROM sph_counter WHERE counter_id=1) 
      AND MATCH (forum_post.content) AGAINST ('searching text') \ 
      AND !MATCH (forum_topic.topic_name) AGAINST ('searching text') 
      GROUP BY(forum_topic.Id) 

    sql_attr_uint = id_topic 
} 

source delta : main 
{ 
    sql_query_pre = SET NAMES utf8 
    sql_query = SELECT * FROM forum_topic LEFT JOIN forum_post ON forum_post.id_topic = forum_topic.Id \ 
      WHERE forum_post.Id<=(SELECT max_doc_id FROM sph_counter WHERE counter_id=1) 
      AND MATCH (forum_post.content) AGAINST ('searching text') \ 
      AND !MATCH (forum_topic.topic_name) AGAINST ('searching text') 
      GROUP BY(forum_topic.Id) 
} 

index main 
{ 
    source = main 
    path = /var/data/main_sphinx 
    charset_type = utf-8 
} 
index delta : main 
{ 
    source = delta 
    path = /var/data/delta_sphinx 
    charset_type = utf-8 
} 

스핑크스로 검색하는 올바른 방법입니까? 아니면 PHP 스크립트에서이 작업을 수행 했습니까?

답변

0

'쿼리'를 구성 파일에 넣지 마십시오. 스핑크스 색인에 모든 문서가 포함되기를 원합니다. Sphinx는 쿼리를 오프라인으로 실행하고 결과를 인덱싱합니다. Sphinx는 인덱스에 대해 쿼리를 실행합니다.

그래서 당신은 actully

sql_query = SELECT p.*,t.* FROM forum_post p INNER JOIN forum_topic p ON p.id_topic = t.Id \ 
     WHERE p.Id<=(SELECT max_doc_id FROM sph_counter WHERE counter_id=1) 

같은 것이 id_topic하여 GROUP을 제안 wouldnt가 원하는 - 그 주제 당 하나의 문서를 의미 때문입니다. 스핑크스가 스레드 당 하나의 게시물 만 볼 수 있다는 것을 의미하므로 대부분의 주제가 검색되지 않습니다.

테이블을 주변으로 이동 시켜서 게시물이 가장 먼저 나옵니다. 그래서 스핑크스 document_id (SELECT 목록의 첫 번째 열)는 post_id입니다. 왜냐하면 그것이 유일하기 때문입니다.

속성으로 주제 ID가 있으므로 필요에 따라 스핑크스에서 그룹화 할 수 있습니다.

이제이 인덱스로 인덱서를 실행하고 모든 문서를 인덱싱 할 수 있습니다.

은 그럼 당신은 (당신의 '텍스트 검색'예처럼) 인덱스에 대해 쿼리를 실행 :

$cl->setMatchMode(SPH_MATCH_EXTENDED); 
$res = $cl->Query('@content searching text','index'); 

이 방법, 당신은 다음, 하나의 인덱스를 구축 반대 인해 임의 쿼리를 실행합니다. @content 구문을 사용

은 (버터를 검색 한 다음 저자에서 제외 것보다, 당신의 쿼리와 컨텐츠 열을 검색만을 의미합니다.

관련 문제