2013-08-05 4 views
2

내 앱 사용자가 검색 할 수 있어야하는 위치의 테이블이 있습니다. "위도/경도 (GIST 사용)뿐만 아니라 일반 필드도 포함하는 PostgreSQL 색인을 만드는 방법

select * from job_locations 
    where earth_box(ll_to_earth(51.5, -0.085), 5000) @> ll_to_earth(latitude, longitude) 
    and earth_distance(ll_to_earth(51.5, -0.085), ll_to_earth(latitude, longitude)) < 5000; 

그리고이 같은 인덱스 :

나는이 같은 쿼리를 사용하고 있습니다 그러나

CREATE INDEX job_locations_lat_lng on job_locations USING gist(ll_to_earth(latitude, longitude)); 

을,이 모든 테이블이있는 멀티 테넌트 (multi-tenant) 시스템이다" tenant_id "필드 및 우리 항상 그걸로 필터. 그래서 이상적으로는 인덱스에 tenant_id와 ll_to_earth (lat, lng)를 모두 가질 수 있습니다. 아마도 훨씬 더 빨리 검색해야합니다.

이것이 가능합니까? 해당 색인은 어떻게 만듭니 까?

감사합니다.
다니엘은

+0

빠른 질문은, '요점 (ll_to_earth()'공간 인덱스 또는 포스트 그레스의 일반적인 인덱스입니까? –

답변

5

당신은 아마부터 존재 한 것으로 나타나는 tenant_id 필드를 포함하는 인덱스를 생성 할 btree_gis톤 확장이 필요합니다 적어도 포스트 그레스 8, 0.4.

CREATE EXTENSION btree_gist; 
CREATE INDEX job_locations_lat_lng ON job_locations USING gist(tenant_id, ll_to_earth(latitude, longitude)); 
+0

우수, 및 추가 확장이 문제를 해결했습니다. 감사! –

+0

빠른 질문입니다'요점 (ll_to_earth()'postgres의 공간 인덱스 또는 일반 인덱스 –

+0

"ll_to_earth()"는 "earthdistance"모듈의 일부입니다 (http://www.postgresql.org/docs/current/static/earthdistance.html 참조). "gist"는 PostgreSQL 코어의 인덱스 유형입니다 (http://www.postgresql.org/docs/current/static/textsearch-indexes.html 참조). – bma