2017-05-10 7 views
0

집계를보고 있었고 painless을 사용하여 스크립팅을 수행 한 결과, 모든 값을 반복/합산하는 방법을 알 수 없습니다. 목적.ElasticSearch/Painless : 개체의 모든 값을 액세스/합계하는 방법

예 :

내 매핑

"field1": { 
    "properties": { 
    "subfield1": { 
     "type": "float" 
    }, 
    "subfield2": { 
     "type": "float" 
    }, 
    "subfield3": { 
     "type": "float" 
    } 
    } 
} 

같은 것은의 내 데이터는 다음과 같습니다 가정 해 봅시다 같습니다

{ 
    "field1" : { 
    "subfield1": 50.0, 
    "subfield2": 20.5, 
    "subfield3": 30.5 
    } 
} 

나는 기본적으로 50.0 + 20.5 + 30.5에 범위 쿼리를 수행 할, 또는, 어떤 식 으로든 field1 개체 내의 모든 값에 액세스하십시오.

집계를 통해 필드에 와일드 카드를 사용할 수 없습니다. 나는 (통증이 없도록 내부적으로 사용 된) looking at the code for LeafDocLookup이었고, 관련 방법이 사용 중지 된 것을 확인했습니다.

나는이 같은 스크립트를 작성 관리했습니다 :

"query": { 
    "script": { 
    "script": { 
     "inline": "return (doc['field1.subfield1'].value + doc['field1.subfield2'].value + doc['field1.subfield3'].value > 50);", 
     "lang": "painless" 
    } 
    } 
} 

그러나 이것은 분명히 서브 최적이며, 동적 키의 주요 문제가 해결되지 않습니다.

+0

당신이 하위 키의 총 (즉, 합계)를 저장할 수 있습니다 사용하는 경우

그래서, 자바 HashMap 개체로 개체에 액세스 할 수 있습니까? 그렇다면 쿼리 할 필드가 하나 뿐이므로 동적 키 이름에 대해 걱정할 필요가 없습니다. – Phil

+0

할 수 있지만, 해시 맵의 모든 요소에 액세스해야하는 경우가 더 많습니다. 정확하게'keySet()'과'values ​​()'와 같은 메소드가있는 이유는 무엇입니까? – shashwat

+1

Painless는 필드의 모든 하위 객체를 가져 오는 것을 지원하지만 일반적으로 ES 쿼리에서 스크립트를 사용하지 않는 것이 좋습니다. 속도가 느리고 일반적으로 스크립트를 피하기 위해 문서를 쿼리하거나 저장하는 더 좋은 방법이 있습니다. – Phil

답변

1

나는 그것을 마침내 발견했습니다! elasticsearch 내의 doc 개체에는 사용할 수 없지만 은 내에서 사용 가능한입니다. 난 당신이 문서를 만들거나 업데이트 할 때 params['_source']

"query": { 
    "script": { 
    "script": { 
     "inline": "float sum = 0.0f; for (float v: params['_source'].values()) { sum += v; } return (sum > 50);", 
     "lang": "painless" 
    } 
    } 
}