2010-10-17 5 views
5

나는 SO에서 검색 한 결과 이것에 대한 답변을 찾지 못했지만 일반적인 문제로 보입니다.효율적으로 가장 가까운 지리적 위치 검색

데이터베이스에 수십만 개의 위치가 있으며 각 위치에는 지오 코드 (위도/경도)가 있습니다. 중요하다면, 그들은 미국 전역에 퍼져 있습니다. 이제 사용자에게 위도/경도 및 반경 (5mi, 10mi, 25mi 등)을 제공하기를 원하는 클라이언트 응용 프로그램이 있습니다. 일치하는 레코드. 나는 가장 짧은 도로 거리가 아니라 Haversine 수식을 통해 얻을 수있는 거리 값만 신경 쓴다. 그러나, 나는 그것이 가능한 한 정확하기를 원한다.

이 데이터베이스는 대부분 읽기 전용입니다. 좋은 날에는 10 개의 인서트가있을 것입니다. 이제 수백 명의 클라이언트가 생겨나게 될 것입니다. 아마 수만 명의 클라이언트가 소프트웨어를 사용할 것입니다. 사용자가 몇 초 내에 결과를 얻길 원하지만, 단일 쿼리에 10-20 초가 걸리면 클라이언트로드로 인해 크롤링됩니다.

가능한 한 효율적으로 결과를 제공하려면 어떻게해야합니까? 난 그냥 MySQL이나 PostgreSQL (오라클과 MS SQL Server는 이것에 대한 아웃 있지만 일부 다른 오픈 소스 데이터 저장소에 괜찮을 수 있습니다)에 저장할 수 있고 그냥 WHERE 조항에 Haversine 수식을 넣을 수 있지만 그 생각하지 않아요 효율적인 결과를 얻을 것입니다.

답변

2

PostgreSQL은 PostGIS 확장이 설치된 경우 광범위한 지리 정보 쿼리를 지원합니다. 가장 가까운 또는 반경 또는 경계 상자 검색은 특히 쉽습니다.

+0

데이터베이스 쿼리 수가 서버에 실제로 도달 할 수 있습니다. 그래서 데이터 인덱싱을 제안합니다 (Local Solr) –

+0

PostGIS의 핵심 기능은 공간 인덱스와 해당 인덱스에 대한 효율적인 쿼리입니다. – SingleNegationElimination

1

반경 검색에 Solr (Lucene 기반 검색 서버)을 사용했습니다. 우리는 사용자가 반지름을 기준으로 속성을 검색 할 수 있도록하는 속성 포털을 작성했습니다.

Google 색인에 데이터베이스가 있으므로 검색 속도가 매우 빠릅니다.

관련 문제