2009-06-28 1 views
5

Lucene API를 사용하여 "지정된 반경 내에서 미국에서 가장 가까운 도시 검색"기능을 사용하고 있습니다. 루씬에서 오전 인덱싱 도시의 위도와 긴 값을 다음과 같이이 :Lucene에서 위도 및 경도 값을 정확하게 색인화합니다.

doc.Add(new Field("latitude", paddedLatitude, Field.Store.YES, Field.Index.UN_TOKENIZED)); 

doc.Add(new Field("longitude", paddedLongitude, Field.Store.YES, Field.Index.UN_TOKENIZED)); 

루씬은 문자열이 아닌 숫자를 이해하기 때문에이 위도 긴 값을 패딩하고있다. 예를 들어

, 원래의 위도와 긴 패딩 후, 값은 같이 각각 41.811846 및 -87.820628을하는 경우 :

paddedLatitude -> "0041.811846"및 paddedLongitude -> "- 087.820628"

Lucene의 ConstantScoreRangeQuery 클래스를 사용하여 가장 가까운 도시 쿼리를 작성하는 동안 동일한 패딩을 수행합니다.

lat 및 long 값이 10 진수/음수 일 수 있다는 점을 감안할 때 lucene이 숫자 범위/비교 연산을 수행 할 때 검색 결과에서 정확한 가장 가까운 도시를 얻을 수 있도록 색인을 생성하는 올바른 방법입니다. 이 값들은?

감사합니다.

답변

6

주제에 대한 전문가 인 우웨 쉰들러 (Uwe Schindler)가 출제 한 약 Searching Numerical Fields in Lucene입니다. Lucene.net이 Lucene 뒤에 약간 있기 때문에 링크에 설명 된 NumericRangeQuery 클래스가 Java Lucene에서 아직 릴리스되지 않았기 때문에 더 오래된 (더 느린) ConstantScoreRangeQuery를 사용해야 할 수도 있습니다.

1

Yuval F의 대답에 링크 된 기사는 내가 틀렸다고 깨달았습니다. earlier answer에 의존하고있는 것 같습니다.

특히 음수가 음수이고 양수가 양수인 경우 음수를 색인화하지 않아야합니다.

This article은 공간 검색에 대한 좋은 토론이있는 것 같습니다. 그는 모든 값을 양수로 만들기 위해 약간의 변형을 사용하고, 거리 계산과 같이 알아 두어야 할 다른 주제에 대해서도 접촉합니다.

값을 인코딩하는 경우 기억할 점 중 하나는 색인 생성과 쿼리 작성시 모두를 인코딩하는 것입니다.

+0

감사합니다 ... 그리고 10 진수는 어떨까요? – user74042

+0

다시 한번 감사드립니다 .... 위의 기사 링크 (http://sujitpal.blogspot.com/2008/02/spatial-search-with-lucene.html)에 언급 된 솔루션을 시도했지만 Lucene.net이 던진 쿼리를 실행합니다. 예외 : 매개 변수 이름 : 위도 System.ArgumentException : 제공된 값이 범위를 벗어났습니다. 매개 변수 이름 : 위도 내 검색어 : 위도 : [131450428 TO 132173263] 경도 : [091694457 TO 092664286] – user74042