2014-05-18 2 views
0

나는 script_score를 사용하여 ID 값의 json을 기반으로 점수를 업데이트하려고합니다. 점수는 원래 점수에 params에 나열된 요소를 곱해야합니다.Elasticsearch script_score with array

"script_score": { 
    "params": { 
     "ranking": { 
     "1": "1.3403946161270142", 
     "3": "1.3438195884227753" 
     } 
    }, 
    "script": "_score * ranking[doc['ID'].value]" 
} 

나는 다음과 같은 오류가 점점 오전 : 내가 수동으로 예를 들어 _score에 대한 ID * 순위를 지정하는 경우

nested: QueryParsingException[[index name] script_score the script could not be loaded]; nested: CompileException[[Error: unbalanced braces [ ... ]]\n[Near : {... _score * ranking[doc['ID'].value] ....}]\n           ^\n[Line: 1, Column: 29]]; }]" 

를 [ '1'], 그것을 잘 작동합니다. 또한 ID를 직접 사용하면 작동하지만 ID 값을 색인으로 사용하면 작동하지 않습니다. 나는 ID가 정수라는 것에 주목해야한다. 누구든지이 문제를 해결할 수 있습니까? 또한 ID가 순위 목록에없는 경우 어떻게 작동합니까? 그것은 점수 = '_ 점수'로 취급할까요?

답변

1

ranking param은 배열이 아니라지도입니다. ID 필드에 사용 된 유형은 맵의 키에 사용 된 유형과 일치해야하며 부스트는 문자열이 아닌 숫자 여야합니다. 업데이트 쿼리 여기

{ 
    "ID" : "1" 
} 

된다 :/_search

{ 
    "query": { 
    "function_score": { 
     "functions": [ 
     { 
      "script_score": { 
      "params": { 
       "ranking": { 
       "1": 1.3403946161270142, 
       "3": 1.3438195884227753 
       } 
      }, 
      "script": "_score * ranking.get(_doc['ID'].value)" 
      } 
     } 
     ] 
    } 
    } 
} 

경우를 처리하지 않습니다 현재 스크립트 항목

GET/테스트 여기

문서입니다 parama지도에 포함되지 않은 경우 NullPointerException으로 연결됩니다.

그런데 나는이 boosting 방법이 당신의 params에있는 문서마다 하나의 엔트리를 가질 필요가 있기 때문에 규모가 커질 것이라고 생각하지 않는다. 각 문서 내에서 순위를 변경하는 것이 좋을 때마다 변경할 때마다 업데이트해야합니다.