2013-10-29 2 views
0

나는 다음과 같은 상황이있다 : DB ~ 116G ~ 800 만. 두 번째 열 등 \ #, %, 난 단지/러시아어, 영어 문자와 숫자로 검색을 구성하려면 같은/러시아어, 영어 문자와 단어, 숫자, 특수 문자를 포함 할 수 있습니다스핑크스와 PHP 통합. 낮은 성능

`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `key` varchar(256) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `key` (`key`(255)) USING BTREE 

: 다음 구조 행 .

스핑크스 구성 :

source keywords 
{ 
    sql_query_pre  = SET NAMES utf8 
    sql_query  = \ 
     SELECT * \ 
     FROM keywords 
    sql_query_info  = SELECT * FROM keywords WHERE id=$id 
} 
index keywords 
{ 
    source   = keywords 
    docinfo   = extern 
    dict   = keywords 
    mlock   = 0 
    min_stemming_len = 1 
    min_word_len  = 1 
    charset_type  = utf-8 
    charset_table = U+0030..U+0039, U+0041..U+005A, U+0061..U+007A, U+0410..U+044F 
    ignore_chars  = U+0021..U+0029, U+003A..U+0040, U+005B..U+0060, U+007B..U+040F, U+0450..U+2FFFF 
    min_prefix_len  = 1 
    enable_star = 1 
    html_strip  = 0 
} 

indexer 
{ 
    mem_limit  = 1024M 
} 

searchd 
{ 
    client_timeout  = 300 
    max_children  = 30 
    max_matches  = 1000000 
    max_packet_size  = 8M 
    max_batch_queries = 32 
} 

PHP 구성 :

$oCl->SetMatchMode(SPH_MATCH_PHRASE); 

    $oCl->SetLimits(0, $iLimit); 

    $sQueryForSphinx = implode('* ', explode(' ', $oCl->EscapeString($sQuery))) . '*'; 

    $aResult = $oCl->Query('" ' . $sQueryForSphinx . ' "'); 
나는 다음 검색 알고리즘을 제공 할

: $ 쿼리에서 내가 사용자 데이터를 가지고있다. 러시아어/영어 문자와 숫자가 공백으로 구분 된 단어 만있을 수 있습니다. 최소 단어 길이는 1입니다. 최소 단어 수는 1이고 최대 문자 수는 3입니다. 사용자가 입력 한 순서와 동일한 순서로이 단어가 포함 된 데이터베이스의 모든 키를 찾고 싶습니다. 또한 모든 단어에는 단어 끝에 추가 기호가 포함될 수 있습니다.

예 : 사용자 입력 : TES 테스트 TEST1은 : 다음 문구를 포함하는 키를 반환해야합니다 : 등, "TEST1 test12 test124", "테스트 TEST1의 test12"을 "TES 테스트 TEST1"을

이 구성 작품 4 개의 기호보다 큰 길이의 단어로 완벽하게. 검색 시간이 5 초 미만입니다.

내 문제는 길이가 4 자 미만인 단어 (예 : "te t test")가 포함 된 구를 입력하면 스핑크스가 매우 느리게 약 1 분 이상 작동한다는 것입니다.

이 문제를 어떻게 해결할 수 있습니까?

답변

0

시도해 볼 수 있습니다 dict=crc, 이러한 쿼리를 위해 훨씬 더 수행해야합니다. (색인 생성 속도가 느리고 색인이 훨씬 더 많이 필요함)

dict=keywords 색인은 짧은 단어 검색의 경우 매우 느릴 수 있습니다. 왜냐하면 '폭발적인 접두어'문제 때문입니다.

dict = 키워드는 최근에 기본 모드로 설정되었으므로 성능은 아직 잘 이해되지 않았습니다. 여기에 의견을 참조하십시오 : http://sphinxsearch.com/blog/2013/09/11/deprecations-and-changes-in-the-2-2-series/ 내가 말하는 색인은 작습니다. 자동 완성을위한 것이지만 100 배의 성능 차이가있었습니다.

+0

대단히 감사합니다. 이제 완벽하게 작동합니다. – Sergey

+0

관심이 있으시면 지금 어떤 종류의 성과를 얻으십니까? 예를 들어 4 글자 단어는 dict = 키워드로 5 초가됩니다. dict = crc과 동일한 검색어는 어떨까요? – barryhunter

+0

안녕하십니까, 세 개의 러시아어 단일 문자 "м нт"~ 12 초, 한 글자 "1"(예 : 2 초) . 내가 길이가 긴 문구를 찾으려고 할 때 99 %의 시간에 2 개의 기호가 $ iMaxResults = 1000 인 경우 1 초 (평균 0.4 초)가됩니다. 나를 위해 그것은 예상대로 완벽하게 작동합니다. 이제 데이터 폴더는 ~ 109GB이며, keywords.spd ~ 103GB 및 keywords.serp ~ 2GB입니다. – Sergey