한 필드 "strArray"에 문자열 배열이 있습니다.
strArray: ['browser:IE', 'device:PC', 'country:USA', 'state:CA']
브라우저 (장치, 국가 또는 주)별로 집계가 필요합니다. strArray 필드에서 이러한 값의 순서를 안다면 문제가되지 않습니다.
이러한 구조를 사용할 수 있습니다.
"aggs": {
"deviceAggs": {
"terms": {
"script": "doc['strArray'][1]"
}
}
}
그러나 문제는 이러한 문자열을 삽입하는 순서가 다를 수 있다는 것입니다.
어떻게 할 수 있습니까? 몇 가지 방법에 대해 생각합니다.
스크립팅-하위 문자열과 같은 기능을 사용하고 "올바른"값만 가져옵니다.
필터링-배열에서 하나의 값 ( "device :"문자열 포함)을 필터링 할 수 있습니다.
strArray 값을 정렬하여 모든 값을 명확한 순서로 배치하지만 "정렬"하면 이상한 결과가 나타납니다. 필터링없이 하나의 요소 만 반환합니다.
구조 키 : 값이 있으면 왜 내가이 구조를 가지고 있는지 묻지 마십시오 (이것은 내 선택이 아닙니다). 우리는 문제가 없을 것입니다.
스크립팅은 여기서 만 직접 가능합니다. 집계에서 스크립팅을 사용하는 방법에 대한 아이디어를 얻으려면이 블로그를 참조하십시오 .
아래와 같은 것이 작동합니다.
for(element in doc['strArray'].values){
if(element.startsWith('browser')){
return element;
}
};
return null;
정렬과 필터링은 모두 요소 수준이 아닌 문서 수준에서 수행됩니다. 요소 수준에서이 배열을 nested로 만들 수 있으면 필터링이 가능합니다. 먼저 구조를 다음과 같이 변경해야합니다.
strArray: [
{ "name" : 'browser:IE' } ,
{ "name" : 'device:PC' }
]
그런 다음 strArray 필드를 중첩으로 만듭니다. 이 경우 접두사 쿼리 (쿼리 필터 사용)를 기반으로 중첩 된 필터를 수행 한 다음 데이터에 대해 중첩 된 집계를 수행 할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다