2011-01-07 4 views
32

Solr의 필드 날짜 유형에 대한 질문이 있습니다. 'date'필드와 'tdate'필드의 차이점은 무엇입니까?Solr 날짜 필드 tdate 대 날짜?

스키마 .xml은 빠른 범위 쿼리의 경우 빠른 날짜 범위 쿼리 및 날짜 패싯에 대해 'tdate 형식'및 'Trie 기반 날짜 필드를 고려합니다. ' 충분히 공정한 ...하지만 precisionStep = "6"은 무엇에 관한 것입니까? 이걸 바꿔야 하나? 내가 tdate를 사용할 경우를 대비해 쿼리를 작성하는 방식이 바뀌는가? Solr이하는 실제 이점은 무엇입니까?) ... 이 또한 확인 : http://www.lucidimagination.com/blog/2009/05/13/exploring-lucene-and-solrs-trierange-capabilities/ http://web.archiveorange.com/archive/v/AAfXfqRYyLnDFtskmLRi

+4

5 년이 지난 지금도 Google, Solr 매뉴얼, solr wiki 등과 같은 상황입니다. 아, 아님, 뭔가 바뀌 었습니다 : Google이 이제 여기에 있습니다 :) – alisa

답변

11

좋은 질문 :-)! 나는 어딘가에 좋은 대답을 읽었으며, 슬프게도 이것을 다시 찾을 수 없다.

기본적으로 트라이 범위가 더 빠릅니다. Here은 하나의 설명입니다. precisionStep을 사용하면 성능 이점을 얻기 위해 색인을 확장 할 수있는 정도를 구성 할 수 있습니다. 링크를 인용하면 다음과 같습니다.

"더 중요한 것은 인덱스 크기에 의존하지 않고 선택한 정밀도입니다."

3

최선을

PS 그래서 나는 친절하고 설명 대답을 감사하겠습니다 운이없이 구글, SOLR 설명서, SOLR 위키와 자바 문서를 통해 갔다 내기는 단지 소스 코드를 보는 것이다. Solr에 대한 몇 가지 사항은 잘 설명되어 있지 않으며 신뢰할 수있는 대답을 얻는 가장 빠른 방법은 코드를 살펴 보는 것입니다. 아직 코드에 참여하지 않았다면 이점이 도움이 될 것입니다. 적어도 장기적으로는.

다음은 TrieTokenizerFactory에 대한 링크입니다.

http://www.jarvana.com/jarvana/view/org/apache/solr/solr-core/1.4.1/solr-core-1.4.1-sources.jar!/org/apache/solr/analysis/TrieTokenizerFactory.java?format=ok

클래스의 javadoc에서는 적어도 precisionStep의 목적을 암시. 더 파고들 수 있습니다.

편집 : 너를 위해 조금 더 파고 들었다. 이것은 Lucene의 NumericTokenStream 클래스에 직접 전달되며,이 클래스는 토큰 스트림을 파싱하는 동안 값을 사용합니다. 아마도 더 면밀한 검사의 가치가있을 것입니다. 이것은 세분성을 다루는 것처럼 보이며 아마도 인덱스의 크기와 속도 사이의 균형입니다.

+0

응답에 감사드립니다. Lucene 포럼에 게시하십시오. tdate와 어떤 거래가 더 명확한 지 분명히 ... 분명히 Solr이 필드와 그 크기를 색인하는 방법 일뿐입니다 : http://lucene.472066.n3.nabble.com /Best-performance-for-facet-dates-in-trunk-using-solr-TrieDateField-td487668.html 인덱스 크기 및 성능 현명한 옵션 외에도 변경해야 할 다른 항목을 찾지 못했습니다. tdate 옵션을 사용하는 경우. –

37

트리는 필드 범위는 일정 범위의 결과를 미리 계산하고 저장함으로써 빠르게 조회 할 "TrieRange의 유일한 단점 때문에 인덱스를 추가 용어로, 조금 큰 인덱스 크기이다" 색인에서 단일 레코드로 표시됩니다. 명확하게하기 위해, 예제에서는 10을 기준으로 정수를 사용합니다. 모든 개념에 동일한 개념이 적용됩니다. 여기에는 날짜가 포함되어 있습니다. 날짜는 1970 년 이후의 초 수로 나타낼 수 있기 때문입니다.

숫자 12345678의 색인을 생성한다고 가정 해 봅시다. 이것을 다음과 같은 토큰으로 토큰화할 수 있습니다.

12345678 
123456xx 
1234xxxx 
12xxxxxx 

토큰 12345678 토큰은 실제 정수 값을 나타냅니다. x 숫자가있는 토큰은 범위를 나타냅니다.123456xx12345600에서 12345699 범위를 나타내고 해당 범위의 토큰을 포함하는 모든 문서와 일치합니다.

목록의 각 토큰에서 연속적으로 x 자릿수가 연속적으로 증가합니다. 이것은 정밀 단계에 의해 제어됩니다. 필자는 두 개의 정밀도를 사용하여 각 여분의 토큰을 만들었 기 때문에 2의 정밀도 단계를 사용한다고 말할 수 있습니다. 3의 정밀도 단계를 사용하려면 이러한 토큰을 얻습니다.

12345678 
12345xxx 
12xxxxxx 

4의 정밀 단계 :

12345678 
1234xxxx 

1의 정밀 단계 :

12345678 
1234567x 
123456xx 
12345xxx 
1234xxxx 
123xxxxx 
12xxxxxx 
1xxxxxxx 

이 쉽게 알 방법 토큰에 작은 정밀 단계 결과와 크기를 증가 색인의. 그러나 범위 쿼리를 빠르게 처리합니다. 내가 1250에서 1275의 범위를 조회하고 싶었 경우 트라이 필드없이

, 루씬 25 개 항목을 가져올 것 ( 1250, 1251, 1252, ..., 1275) 및 검색 결과를 결합합니다. 트라이 필드 (1 정밀 단계), 우리는 8 개 항목을 가져 오는 멀리 얻을 수 ( 125x, 126x, 1270, 1271, 1272, 1273, 1274, 1275), 125x1250의 미리 계산 된 집계하기 때문에 - 1259은. 1보다 큰 정밀도 단계를 사용하면 쿼리는 25 개의 개별 항목을 모두 가져 오는 것으로 되돌아갑니다.

참고 : 실제로, 정밀도 단계는 각 토큰에 대해 다듬은 비트 수를 나타냅니다. 숫자를 16 진수로 쓰려면 4의 정밀도 단계로 각 토큰에 대해 16 진수를 하나씩 자릅니다. 8의 정밀도 단계는 두 개의 16 진수를 트림합니다.

+1

대단한 설명. 나는 정밀한 단계를 이해하려고 몇 시간 동안 책을 읽었으며, 이것이 의미있는 첫 번째 설명입니다. –

+0

1970 년 이래로 몇 초가 걸리는 것은 이론적 인 방법이 아닙니다. 실제로 완료된 방법이며, 널 날짜 필드가 있으면 1970 년부터 0 초로 간주됩니다. 결과는 널 (null) 및 비 널 trie 날짜 필드 순서는 끔찍합니다. 1970 년 이전의 날짜, null 값, 1970 년 이후의 날짜가 표시됩니다. – mlissner