2012-10-18 2 views
3

우리는 다양한 검색 응용 프로그램에 solr 인덱스를 사용하고 있습니다. 대부분의 경우 관리자 인터페이스와 마찬가지로 사용합니다. 예 :Solene에 의해 인덱싱 된 DateField에 대한 Lucene 쿼리

+text:Mr +text:burns +publish_date[2012-09-10T00:00:00Z TO 2012-10-10T00:00:00Z] 

이 작동합니다.
내 문제는 하나의 응용 프로그램에서 우리는 복잡한 lucene 쿼리를 사용하여 (솔러 사용하지 않고) 인덱스에 대해 직접 쿼리를 수행 할 수 없다는 것을 알 수 있습니다. 의 schema.xml에서
는 :

<field name="publish_date" type="date" indexed="true" stored="true"/> 

이 보인다 SOLR 저장 밀리 초 유닉스 시간과 날짜, 그것이 내가했습니다 루씬에서 그 1336867200000

처럼 보이는 인덱스에서 필드를 당겨 때

TermRangeQuery nq1 = new TermRangeQuery("publish_date", "1299628800000", "1336867200000", true, true); 
TermRangeQuery nq1 = new TermRangeQuery("publish_date", "1299628800", "1336867200", true, true); 
TermRangeQuery nq1 = new TermRangeQuery("publish_date", "2012-09-10T00:00:00Z", "2012-10-10T00:00:00Z", true, true); 
TermRangeQuery nq1 = new TermRangeQuery("publish_date", "20120910", "20121010", true, true); 
NumericRangeQuery nq1 = NumericRangeQuery.newLongRange("publish_date", 1299628800, 1336867200, true, true); 

과 몇 가지 다른 시도 ...
반환 고해상도를 한 유일한 질의 : 내가 생각할 수있는 모든 쿼리를 시도 ULTS은 물론

TermRangeQuery nq1 = new TermRangeQuery("publish_date", null, null, true, true); 

이는 "오픈 엔드 포인트"가있는 쿼리입니다했다하지만 필드 (동일 INT 범위 또는 장거리 작동하지 않았다) 문자열로 색인 것을 적용하는 것처럼 보인다.
실망 스러울 것은 분명히 가능하다는 것인데, 어떻게 복용량 solr 그것이 날짜 범위를 preforms하는지 알아 내야 만합니다.
누구든지이 검색을 수행하는 방법을 알고 있습니까?
도움이 될 것입니다.

답변

2

"1336867200000"은 타임 스탬프입니다 (예).

TermRangeQuery nq1 = new TermRangeQuery("publish_date", "1299628800000", "1336867200000", true, true); 
TermRangeQuery nq1 = new TermRangeQuery("publish_date", "1299628800", "1336867200", true, true); 
TermRangeQuery nq1 = new TermRangeQuery("publish_date", "2012-09-10T00:00:00Z", "2012-10-10T00:00:00Z", true, true); 
TermRangeQuery nq1 = new TermRangeQuery("publish_date", "20120910", "20121010", true, true); 

숫자 데이터에 문자열 매개 변수를 사용하고 있기 때문에 위의 코드는 작동하지 않습니다.

NumericRangeQuery nq1 = NumericRangeQuery.newLongRange("publish_date", 1299628800, 1336867200, true, true); 

충분한 0으로 채우지 않았기 때문에이 방법이 작동하지 않습니다. 당신이 2011년 9월 3일와 13/05/2012 사이에 일자 문서 (들)가있는 경우 금 1월 16일 그리니치 표준시 02시 00분 28초에 대한 1,299,628,800 스탠드 1970

, 다음과 같은 작업을해야합니다 :

NumericRangeQuery nq1 = NumericRangeQuery.newLongRange("publish_date", 1299628800000L, 1336867200000L, true, true); 
+0

감사합니다. 이것은 일종의, 일종의 ... 그것은 단지 내가 공급 정확한 값을 가진 워드 프로세서를 찾습니다. 이는 범위로 작동하지 않으며 null min 또는 null max로도 작동하지 않는다는 것을 의미합니다. 내가 뭔가 잘못하고있는 것 같아.하지만 나는 무엇이 확실하지 않다. 또한 큰 범위 (예 : 날짜)에 관해서는 성능에 좋지 않은 범위 쿼리가 아닌가? solr이이 필드를 처리하는 방법을 알고 싶습니다. 이와 같은 쿼리를받을 때 백그라운드에서 수행하는 작업은 무엇입니까? publish_date : [2012-09-10T00 : 00 : 00Z TO *] –

+0

내 NumericRangeQuery 길에서 precisionStep (40 이상). 이제 solr 관리 인터페이스를 사용할 때와 비슷한 결과를 얻습니다. 아직 이해가 안됩니다. ** 정확도에 해당하는 lucene은 무엇입니까? ** 다른 말로하면 위에 정의 된 필드의 "올바른"NumericRangeQuery는 무엇입니까? –

+0

저는 Solr의 precisionStep이 Lucene을 복제한다고 생각합니다.정밀도 단계에 대한 자세한 내용은 http://lucene.472066.n3.nabble.com/what-is-precisionStep-and-positionIncrementGap-td3991706.html을 참조하십시오. – mindas