Result Grouping은 그룹내의 공통 필드 값과 각 그룹들의 최상위 문서의 반환으로 문서들을 묶어준다. 예를들어, 전자제품 관련 소규모 전자상거래 사이트에서 "DVD"를 찾는다고하고, 각 카테고리 별로 3개의 값이 있는 "TV와 비디오", "영화" 그리고 "컴퓨터" 같은 3개의 분류가 나왔다고 하자. 이 경우, 질의어 "DVD"는 3개의 분류 모두에 들어있기에, Solr는 사용자에게 관련성 증진을 위해 모두 묶어준다.
Result Grouping은 Faceting으로 구분한다. 개념적으로 비슷하긴 하지만, faceting 은 모든 관련된 결과를 반환하고 사용자에게 facet 분류 기반의 결과를 가공할 수 있게 한다. 예들들어, 신발 관련 전자상거래 사이트에서 "shoes"를 검색한다면, Solr는 그 질의어에 대해서 "크기", "색상", "브랜드" 등등의 선택적인 facet들을 포함한 모든 결과를 반환할 것이다.
faceting으로 묶는 것을 조합하는 것을 할 수 있게 될 것이다. faceting 그룹은
facet.field
와 facet.range을 지원하지만, 날짜와 피벗 faceting은 현재까진 지원하지 않는다. facet은 첫번째
group.field 파라메터 값에 기반한 계산 값을 세고, 다른 group.field 파라메터들은 무시된다.
Grouped faceting differs from non grouped facets (sum of all facets) == (total of products with that property) as shown in the following example:
faceting을 묶는 것은 facet들을 묶지 않은 것과 다르다란 것을 (모든 facet들의 합계) == (같은 속성의 상품들의 합계) 다음의 예제에서 보여준다:
Object 1
- name: Phaser 4620a
- ppm: 62
- product_range: 6
Object 2
- name: Phaser 4620i
- ppm: 65
- product_range: 6
Object 3
- name: ML6512
- ppm: 62
- product_range: 7
만약 Solr에게 "product_range"로 이 문서들을 묶으라고 요청했다면, 그룹들의 총 갯수는 2개지만, ppm에 대한 facet들은 62에 대해선 2개고 65에 대해선 1개이다.
Request Parameters
Result Grouping은 다음의 요청 파라메터들이 필요하다. 몇 개든 이 요청 파라메터들은 한번의 요청에 포함되야 한다.
Parameter
|
Type
|
Description
|
---|---|---|
group
|
Boolean
|
true면, 질의는 그룹을 만든다.
|
group.field
|
string
|
결과를 묶어줄 필드의 이름. 필드는 한가지 값만 가져야 하고, 색인되있어야 하거나 필드 유형이 값 기반이고
ExternalFileField 같은 함수 질의에서 동작해야 한다. 또한 StrField 또는 TextField 같은 문자 기반 필드여야한다. |
group.func
|
query
|
함수 쿼리에 의한 유일한 값에 기반한 그룹.
|
group.query
|
query
|
주어진 질의에 맞는 문서의 그룹 한개를 반환함.
|
rows
|
integer
|
반환할 그룹의 갯수. 기본값은 10.
|
start
|
integer
|
그룹의 목록에서 초기 위치 지정
|
group.limit
|
integer
|
각 그룹에서 반환할 결과의 갯수 지정. 기본값은 1.
|
group.offset
|
integer
|
각 그룹의 문서 목록의 초기 위치 지정.
|
sort
|
sortspec
|
관계있는 다른 그룹들간의 Solr 정렬 방식을 지정. 예를들면, sort=popularity desc는 각 그룹에서 가장 많이 찾는 문서들순으로 지정하는 것이다. 기본값은 score desc.
|
group.sort
|
sortspec
|
각 그룹내의 문서들의 Solr 정렬 방식을 지정. group.sort를 지정안하면 기본 동작은
sort 파라메터로서 같은 효과적인 값을 사용한다. |
group.format
|
grouped/simple
|
이 파라메터가 simple로 설정되면, 문서 묶음들은 하나의 평면적인 목록을 보여주고,
start 와 rows 파라메터들은 그룹이 아니라 문서의 갯수로서 사용되게 된다. |
group.main
|
Boolean
|
true면, 그룹핑 명령어의 첫번째 필드로 인한 결과값은 group.format=simple를 사용한 주요 결과 목록을 사용하여 응답하게 한다.
|
group.ngroups
|
Boolean
|
true면, Solr는 결과내에서 쿼리와 일치하는 그룹의 숫자를 포함한다.. 기본값은 false.
파편화된 인덱스들을 사용했을때 분산된 Result Grouping 절차(Distributed Result Grouping Caveats)에 대해선 아래를 보라.
|
group.truncate
|
Boolean
|
true면, facet 수량은 질의어와 일치하는 각 그룹에서 가장 연관있는 문서에 기반한다. 기본값은 false.
|
group.facet
|
Boolean
|
facet.field 파라메터들에 정의된 필드 facet들에 대한 facet 묶음을 연산할지 결정한다. 묶여진 facet들은 첫번째로 정의된 그룹에 기반하여 연산된다. 보통의 필드 faceting은, 필드들은 토큰화하지 않는다(그렇지 않다면 수량은 각각의 토큰들에 의해 계산된다). 묶여진 faceting은 단일 필드와 복수 필드들을 지원한다. 기본값은 false이다.
|
group.cache.percent
|
integer between 0 and 100
|
이 파라메터에 0보다 큰 숫자를 설정하면 결과 그룹에서 캐싱을 가능하게 한다. Result Grouping은 2개의 검색을 실행한다; 이 옵션은 두번째 검색을 캐시한다. 기본값은 0. 테스트해보니 그룹 캐시는 Boolean, 와일드카드, 그리고 애매한 질의어에 대한 검색시간을 개선해줬다. 단어에 대한 단순 질의어들이나 "전부 일치" 쿼리들에 대해서는 그룹 캐싱은 성능 저하를 보였다.
|
그룹 명령어들이 몇개든 (
group.field
, group.func
, group.query
) 한번의 요청에 기술되야 한다.Examples
다음의 예제 질의들은 Solr의 "
bin/solr -e techproducts
" 예제에서 동작한다.필드로 결과 묶기
이 예제에서는, 샘플 데이터셋의 상품들중 제조자로 지정되는
manu_exact
필드에 기반해서 결과를 묶을 것이다.
우리의 질의에 대해서 일치하는 총 6개의 결과가 응답에 보여진다. group.field의 각각의 유일 값들은, Solr가 문서 점수 상위의
docList
를 반환한다. docList
는 또한 그룹별 일치하는 총갯수인 numFound 값을 포함한다. 그룹들은 각 그룹내의 최고 점의 문서에 의해 정렬되었다.
group.main=true를 요청 파라메터에 사용하여 같은 질의를 실행해 보자. 이것은 결과들을 하나의 평면적인 문서 목록으로 형식을 지정할 것이다. 이 평면 형식은 일반적인 그룹 질의어 결과보다는 적은 정보를 포함하지만, Solr 클라이언트가 구문 분석을 하기에는 쉬울 것이다
쿼리로 묶기
이 예제에서는, 2개의 다른 가격 범위를 갖는 "memory" 에 대한 최상위 3개의 결과를 찾기 위해 group.query 파라메터를 사용할 것이다. 0.00에서 99.99, 그리고 100 이상.
이 경우, Solr는 "memory"에 대해 일치하는 5개의 검색 결과를 찾았지만, 가격으로 묶은 4개의 결과들만 반환한다. 이 경우 "memory"에 대한 1개의 결과는 가격에 할당된 조건이 아닌 것이다.
분산 결과 그룹화 규칙
그룹화는 몇가지 규칙내에서 분산 검색(distributed searches)을 지원한다:
- group.func는 현재 어떤 분산 검색에서도 지원하지 않는다
group.ngroups
andgroup.facet
require that all documents in each group must be co-located on the same shard in order for accurate counts to be returned. Document routing via composite keys can be a useful solution in many situations.
댓글 없음:
댓글 쓰기