2012-03-08 4 views
4

LatLonType (subType = tdouble) 스키마가있는 공간 필터링으로 SOLR-3.4를 사용하고 있습니다. 나는 약 20M 장소의 색인을 가지고있다. 내 기본 문제는 캐시 = true로 bbox 필터를 수행하면 성능이 비교적 좋으며 (~ 40-50 QPS, 약 100-150ms 대기 시간) 크나큰 단점이 궁극적으로 메이저 콜렉션으로 이어지는 것입니다 30-40 분마다 (매우 큰 힙에 25GB). 그리고 그 시점에서 성능은 용납 할 수없는 수준입니다. 반면에 나는 bbox 필터에 대한 캐싱을 해제 할 수 있지만 대기 시간과 QPS는 떨어집니다 (대기 시간은 100ms => 500ms). NumericRangeQuery javadoc은 얻을 수있는 뛰어난 성능 (100 밀리 초 미만)에 대해 이야기했지만, 이제는 filterCache가 활성화되어 있는지 궁금해하며 결과적으로 힙 성장을 살펴 보지 못했습니다. 어느 구성도 실제로 받아 들일 수 없기 때문에 이런 종류의 catch-22라고 생각합니다.공간적 성능이 좋지 않습니다.

나는 어떤 생각이든 열려 있습니다. 나의 마지막 아이디어 (시도되지 않음)는 geo 해시를 사용하는 것입니다 (그리고 cache = false로 더 잘 수행되거나 cache = true 인 경우 더 많은 힙 증가가 가능하도록기도합니다).

편집 :

정밀 단계 : (내 생각 이중 8) 기본

시스템 메모리 : 32기가바이트 (EC2 M2 2XL)

JVM : 24기가바이트

색인 크기 : 11기가바이트

EDIT2 :

,536,

precisionStep이 8 인 tdouble은 복식이 8 비트 시퀀스로 분할된다는 것을 의미합니다. 모든 위도와 경도가 8 비트의 마지막 순서 만 다른 경우 tdouble은 범위 쿼리에서 정상적인 성능을 갖습니다. 이것이 제가 4의 정밀도 스텝을 테스트 할 것을 제안한 이유입니다.

질문 : 이중 값에 대해 실제로 의미하는 것은 무엇입니까?

+0

tdouble 필드에 어떤 precisionStep을 사용하고 있습니까? 시스템 적으로 OS 캐시에 남은 메모리가 있습니까? 시스템의 전체 메모리 양, JVM에 주어진 양 및 색인 크기 (바이트 단위)를 공유 할 수 있습니까? – jpountz

+0

@jpountz : 업데이트 된 질문을 참조하십시오. 인덱스 크기를 얻는 방법을 모르겠습니다. – Kevin

+0

유닉스에서는'du -hs indexDir' 만 실행하면된다.Windows에서는 인덱스 디렉토리에서 마우스 오른쪽 버튼을 클릭 한 다음 propertis를 클릭하면됩니다. – jpountz

답변

1

공간 쿼리에 응답하는 동안 Solr의 프로필을 보유하면 느린 것을 이해하는 데 큰 도움이됩니다. 예를 들어 hprof을 참조하십시오.

그래도 대기 시간을 향상시킬 수있는 방법에 대한 몇 가지 아이디어가 있습니다.

먼저 precisionStep (예 : 4 번 시도)을 줄이면 어떻게되는지 테스트 해 볼 수 있습니다. 위도와 경도가 서로 너무 가깝고 precisionStep이 너무 높으면 Lucene은 여러 개의 인덱스 값을 사용할 수 없습니다.

또한 OS 캐시에 자주 액세스하는 인덱스 파일을 캐시 할 수있는 기회를주기 위해 JVM에 메모리를 약간 줄여보십시오.

여전히 빠르지 않은 경우 getRangeQuery 메서드에 a frange query을 사용하는 필드 유형으로 하위 필드로 TrieDoubleField를 대체하는 방법을 시도해 볼 수 있습니다. 이렇게하면 더 높은 메모리 사용량을 희생하여 범위를 계산하면서 디스크 액세스 수를 줄일 수 있습니다. (나는 그것을 테스트 한 적이 없으며, 끔찍한 성능을 제공 할 수도 있습니다.)

+0

안녕하세요, "위도와 경도가 서로 너무 가깝고 정밀도가 너무 높으면 Lucene은 여러 가지 인덱스 값을 사용할 수 없습니다."라는 의미를 설명 할 수 있습니까? 내 특별한 경우에는 1 마일에서 20 마일 (1 마일과 5 마일이 가장 빈번한 것 같지만 아직 구체적으로 체크하지 않은 것으로 추측합니다)의 경계 상자를 만듭니다. – Kevin

+0

내 인덱스가 디스크에서 11GB를 차지하고 있기 때문에 OS가 전체 캐시를 처리하는 데 거의 동일한 것으로 간주해야합니까? 디스크의 인덱스 크기가 저장된 필드를 차지합니까? 아니면 엄격하게 인덱스입니까? 필자가 보았던 한 가지 권고안은 저장된 필드를 문서 키로 축소 한 다음 SOLR 외부의 문서를 관리하는 것입니다 (즉, solr에서 인덱싱 만 수행). – Kevin

+0

도 geohash에 댓글을 달 수 있습니까? 대체 구현 (예 : schema.xml 만 변경) 한 다음 bbox 필터 쿼리가 geohash 필드를 가리키는 것으로 보입니다. – Kevin

관련 문제