2012-01-11 2 views
0

생각 나는 스핑크스 젬을 사용하고 있습니다. 쿼리를 완료하는 데 약 45 초 (인덱스가 포함 된 폴더는 1.1GB)가 소요됩니다. 내가 뭔가 잘못 구성되어 있다고 가정합니다 (처음 스핑크스 사용자). 어쨌든 저렇게 보이는 것이 있으면 저에게 알려주십시오. 여기 내 구성은 다음과 같습니다스핑크스에서 검색 시간을 줄이려는 아이디어

Location.search('Restaurant', 
       :geo => [0.5837843098436726,-1.9560609568879357], 
       :latitude_attr => "latitude", 
       :longitude_attr => "longitude", 
       :with => {"@geodist" => 0.0..4000.0}, 
       :include => :categories, 
       :page => 1, 
       :per_page => 100) 

내 로그 보여줍니다 : 나는이 문서를 통해 파고 물건을 시도하겠습니다

Sphinx Query (43066.3ms) restaurant 
Sphinx Found 467 results 

다음
define_index do 
    indexes :name 
    indexes :summary 
    indexes :tag_list 

    indexes categories.name, :as => :category_name 

    has "RADIANS(lat)", :as => :latitude, :type => :float 
    has "RADIANS(lng)", :as => :longitude, :type => :float 

    set_property :field_weights => { 
    :name   => 8, 
    :summary  => 6, 
    :category_name => 5, 
    :tag_list  => 3 
    } 
    set_property :delta => ThinkingSphinx::Deltas::ResqueDelta 
    set_property :ignore_chars => %w(' -) 
end 

는 예를 들어 쿼리입니다!

UPDATE : 내 development.sphinx.conf

indexer 
{ 
} 

searchd 
{ 
    listen = 127.0.0.1:9312 
    log = /project_path/log/searchd.log 
    query_log = /project_path/log/searchd.query.log 
    pid_file = /project_path/log/searchd.development.pid 
} 

source location_core_0 
{ 
    type = pgsql 
    sql_host = localhost 
    sql_user = user 
    sql_pass = pass 
    sql_db = db_name 
    sql_query_pre = UPDATE "business_entities" SET "delta" = FALSE WHERE "delta" = TRUE 
    sql_query_pre = SET TIME ZONE 'UTC' 
    sql_query = SELECT "business_entities"."id" * 1::INT8 + 0 AS "id" , "business_entities"."name" AS "name", "business_entities"."summary" AS "summary", "business_entities"."tag_list" AS "tag_list", "business_entities"."id" AS "sphinx_internal_id", 0 AS "sphinx_deleted", CASE COALESCE("business_entities"."type", '') WHEN 'Location' THEN 2817059741 WHEN 'Group' THEN 2885774273 WHEN 'BraintreeBusiness' THEN 28779289 WHEN 'InvoicedBusiness' THEN 1440117572 ELSE 2817059741 END AS "class_crc", COALESCE("business_entities"."type", '') AS "sphinx_internal_class", RADIANS(lat) AS "latitude", RADIANS(lng) AS "longitude" FROM "business_entities" WHERE ("business_entities"."type" = 'Location') AND ("business_entities"."id" >= $start AND "business_entities"."id" <= $end AND "business_entities"."delta" = FALSE AND "business_entities"."type" = 'Location') GROUP BY "business_entities"."id", "business_entities"."name", "business_entities"."summary", "business_entities"."tag_list", "business_entities"."id", "business_entities"."type" 
    sql_query_range = SELECT COALESCE(MIN("id"), 1::bigint), COALESCE(MAX("id"), 1::bigint) FROM "business_entities" WHERE "business_entities"."delta" = FALSE 
    sql_attr_uint = sphinx_internal_id 
    sql_attr_uint = sphinx_deleted 
    sql_attr_uint = class_crc 
    sql_attr_float = latitude 
    sql_attr_float = longitude 
    sql_attr_string = sphinx_internal_class 
    sql_query_info = SELECT * FROM "business_entities" WHERE "id" = (($id - 0)/1) 
} 

index location_core 
{ 
    source = location_core_0 
    path = /project_path/db/sphinx/development/location_core 
    morphology = stem_en 
    charset_type = utf-8 
    ignore_chars = ', - 
    enable_star = 1 
} 

source location_delta_0 : location_core_0 
{ 
    type = pgsql 
    sql_host = localhost 
    sql_user = user 
    sql_pass = pass 
    sql_db = db_name 
    sql_query_pre = 
    sql_query_pre = SET TIME ZONE 'UTC' 
    sql_query = SELECT "business_entities"."id" * 1::INT8 + 0 AS "id" , "business_entities"."name" AS "name", "business_entities"."summary" AS "summary", "business_entities"."tag_list" AS "tag_list", "business_entities"."id" AS "sphinx_internal_id", 0 AS "sphinx_deleted", CASE COALESCE("business_entities"."type", '') WHEN 'Location' THEN 2817059741 WHEN 'Group' THEN 2885774273 WHEN 'BraintreeBusiness' THEN 28779289 WHEN 'InvoicedBusiness' THEN 1440117572 ELSE 2817059741 END AS "class_crc", COALESCE("business_entities"."type", '') AS "sphinx_internal_class", RADIANS(lat) AS "latitude", RADIANS(lng) AS "longitude" FROM "business_entities" WHERE ("business_entities"."type" = 'Location') AND ("business_entities"."id" >= $start AND "business_entities"."id" <= $end AND "business_entities"."delta" = TRUE AND "business_entities"."type" = 'Location') GROUP BY "business_entities"."id", "business_entities"."name", "business_entities"."summary", "business_entities"."tag_list", "business_entities"."id", "business_entities"."type" 
    sql_query_range = SELECT COALESCE(MIN("id"), 1::bigint), COALESCE(MAX("id"), 1::bigint) FROM "business_entities" WHERE "business_entities"."delta" = TRUE 
    sql_attr_uint = sphinx_internal_id 
    sql_attr_uint = sphinx_deleted 
    sql_attr_uint = class_crc 
    sql_attr_float = latitude 
    sql_attr_float = longitude 
    sql_attr_string = sphinx_internal_class 
    sql_query_info = SELECT * FROM "business_entities" WHERE "id" = (($id - 0)/1) 
} 

index location_delta : location_core 
{ 
    source = location_delta_0 
    path = /project_path/db/sphinx/development/location_delta 
} 

index location 
{ 
    type = distributed 
    local = location_delta 
    local = location_core 
} 
+0

당신이 여기 sphinx.conf을 게시하시기 바랍니다 수 : 나는 걱정 입력합니다. –

+0

구성 파일을 게시하는 경우 데이터베이스에서 자격 증명 정보 (사용자 이름 및 암호)를 제거해야합니다. – pat

+0

ok, 게시 내 development.sphinx.conf –

답변

0

내 문제가 발견되었습니다 - 레코드가 STI 테이블에있는 일이지만 위치 유형 (위치에 자손이 없음) 만 인덱싱하려고합니다. 이 테이블에있는 1300 만 레코드 중 99.99984 % (심각하게)는 위치 유형입니다. SELECT DISTINCT 유형 FROM business_entities 쿼리가 너무 길어지고 있습니다 (색인 포함). 로그 84 초 지속 스핑크스 쿼리보고 된 이후 까다로운 부분이 몰래되었지만 문제였다 정말 약탈 SQL 쿼리이었다

SQL (43647.1ms) SELECT DISTINCT type FROM business_entities 
SQL (39857.7ms) SELECT DISTINCT type FROM business_entities 

Sphinx Query (84173.0ms) restaurant 

그래서 원숭이는 반환시에만 이니셜 라이저에서 스핑크스 생각 패치

module ThinkingSphinx 
    class Source 
    module SQL 
     def type_values 
     ['Location'] 
     end 
    end 
    end 
end 

https://gist.github.com/1603565

+1

Sphinx 설정에서 WHERE 절의 일부로 이것을 추가 할 수도 있습니다 - define_index 블록의 다음 부분은 트릭을 수행해야합니다 :'where "business_entities.type = 'Location'" " – pat

+1

또한 : 나는 그 유형 열에 데이터베이스 인덱스를 두는 것이 좋습니다. – pat

0

나는 그것이 검색 속도가 느린 실행중인 정확하게 이유를 모르겠지만, 나는 당신의 쿼리에서 일을 단순화하고, 다시 복잡성을 추가하여 시작 했죠 특히 어떤 것이 원인인지 알아보기 위해 조금씩. 그래서, 첫째 :

Location.search('Restaurant') 

아마도 :

Location.search('Restaurant', :per_page => 100) 

등등. 인덱스 정의에서 :field_weights도 효과가 있음을 잊지 마십시오.

내가 말했듯이, 나는 당신이하는 일에 특히 이상한 것을 발견하지 못했고, 43 초간의 검색 (또는 그것에 가까운 것)은 내가 전에 만나지 않은 것입니다.

+0

답장 팻 주셔서 감사합니다, 난 그냥 간단한 쿼리를 시도 - 조금 오래 걸립니다 - 나는 필드 가중치를 인덱스에서 제거 시도하고 아무런 영향을 미치지 않습니다. 내가 협회에서 가지고있는 색인을 삭제했기 때문에 색인을 만드는 시간이 줄어 들었습니다. 나는 물건들을 계속 노력할 것입니다. –