2017-12-11 21 views
1

의 범위에서 문서를 계산 :SOLR 여기에 내가 가진 몇 가지 예를 SOLR 문서 두 개의 날짜 필드

{ 
    "id": "1", 
    "openDate": "2017-12-01T00:00:00.000Z", 
    "closeDate": "2017-12-04T00:00:00.000Z" 
}, 
{ 
    "id": "2", 
    "openDate": "2017-12-02T00:00:00.000Z", 
    "closeDate": "2017-12-04T00:00:00.000Z" 
}, 
{ 
    "id": "3", 
    "openDate": "2017-12-02T00:00:00.000Z", 
    "closeDate": "2017-12-06T00:00:00.000Z" 
} 

날짜 문서가 "활성"이라고이 openDate (포함) 사이의 날짜가됩니다 closeDate (독점). 나는 매일에 "활성"있는 문서의 수를 계산하려면, 그래서 출력은 다음과 같아야합니다

[ 
    { 
    Date: 2017-12-01, 
    count: 1 
    }, 
    { 
    Date: 2017-12-02, 
    count: 3 
    }, 
    { 
    Date: 2017-12-03, 
    count: 3 
    }, 
    { 
    Date: 2017-12-04, 
    count: 1 
    }, 
    { 
    Date: 2017-12-05, 
    count: 1 
    } 
] 

이 다중 값 날짜 필드를 유지하는 것입니다 해결하는 한 가지 쉬운 방법 (openDates라고 말) 관심의 범위에서 모든 날짜에, 그래서 우리는이 같은 문서를 확장

{ 
    "id": "1", 
    "openDate": "2017-12-01T00:00:00.000Z", 
    "closeDate": "2017-12-04T00:00:00.000Z", 
    "openDates": ["2017-12-01T00:00:00.000Z", 
        "2017-12-02T00:00:00.000Z", 
        "2017-12-03T00:00:00.000Z"] 
    }, 
    { 
    "id": "2", 
    "openDate": "2017-12-02T00:00:00.000Z", 
    "closeDate": "2017-12-04T00:00:00.000Z", 
    "openDates": ["2017-12-02T00:00:00.000Z", 
        "2017-12-03T00:00:00.000Z"]  
    }, 
    { 
    "id": "3", 
    "openDate": "2017-12-02T00:00:00.000Z", 
    "closeDate": "2017-12-06T00:00:00.000Z", 
    "openDates": ["2017-12-02T00:00:00.000Z", 
        "2017-12-03T00:00:00.000Z", 
        "2017-12-04T00:00:00.000Z", 
        "2017-12-05T00:00:00.000Z"]  
    } 

은 그 때 나는 이런면 쿼리를 실행할 수 있습니다

/select?q=*:*&facet=true&facet.field=openDates&rows=0 

내가 필요로하는 수를 얻을 수 있습니다.

Solr에서 이것을 해결하는 더 좋은 방법이 있습니까?

이상적으로 대체 접근법은 일뿐만 아니라 시간 또는 분 단위로 버킷을 도울 수 있습니다. 위의 방법은 좀 더 세분화하면 매우 큰 다중 값 필드를 갖게됩니다. 또한 제로 카운트로 구멍 (예 : 누락 날짜)을 채우는 좋은 방법이 있습니까?

답변

2

DateRangeField은 구조 용으로 제공됩니다. 스키마에서이 같은 뭔가를 추가합니다 :

<fieldType name="range_date" class="solr.DateRangeField" /> 
<field name="active" type="range_date" indexed="true" stored="false"/> 

당신은이 같은 활성 range를 지정할 수 있습니다 :이 필드에 의해

doc1.addField("active", "[2017-12-01T00:00:00.000Z TO 2017-12-04T00:00:00.000Z]") 

나중에 요청 range facets합니다. 난 당신이 원하는대로 정확한 형식의 응답을 유지하기 위해 facet.range.include=outer을 추가 한

 q.add("facet", "true") 
     q.add("facet.range", "active") 
     q.add("facet.range.start", "NOW/MONTH") 
     q.add("facet.range.end", "NOW/MONTH+1MONTH") 
     q.add("facet.range.include", "outer") 
     q.add("facet.range.gap", "+1DAY") 

(상위 및 하위 경계를 포함하지 않는 : 1 일 단위로 PARAMS의

예 (서로 다른 값에 대한 gap PARAM을 변경할 수 있습니다)). 이 매개 변수는 choosing으로 변경할 수 있습니다.

당신은 당신이 필요로 정확히 얻을 것이다 : 코드의

2017-12-01T00:00:00Z 
1 
2017-12-02T00:00:00Z 
3 
2017-12-03T00:00:00Z 
3 
2017-12-04T00:00:00Z 
1 
2017-12-05T00:00:00Z 
1 

전체 예 here이다.