2015-01-05 1 views
2

신축성이 있습니다. function_score를 사용하여 점수를 사용자 지정합니다. 여기 내 코드는 다음과 같습니다.script_score는 lang groovy를 사용하여 elastic 1.3에서 0을 반환합니다.

body = { 
     "from" : product_per_page*page, 
     "size" : product_per_page, 
     "query": { 
      "function_score": { 
       "query": { 
        "bool":{ 
         "must": [ 
          { 
           "range": { 
            "price": { 
             "gte": from_price, 
             "lte": to_price 
             } 
            } 
          }, { 
           "match":{ 
            "text": { 
             "query": query, 
             } 
            }, 
           } 
          ] 
         }, 
        }, 
       "script_score": { 
        "script": "floor(_score)*doc['boost'].value", 
        "lang":"groovy" 
        }, 
       "boost_mode": "replace", 
       }, 
      } 
     } 

점수는 항상 0.0을 반환합니다. I가 스크립트를 설정하면 는 :

"script": "_score" 

는 0.98977035 같은 정확한 점수 (0.0과 1.0 사이의 숫자)를 반환합니다.

"script": "_score + 0.0001" 

다시 올바른 것으로 반환됩니다. 하지만 이것을 사용했을 때

"script": "_score + 1" 

그것을 반환 1.0 :

"script": "_score *10" 

되돌아 0.0 (및 함수 I는 "script": "floor(_score)" 되돌아 0.0 사용). 또한 :

"script": "32" 

을하고 (I 예상대로) 32 리턴

"script": "doc['boost'].value" 

되돌아 0.0 I는 시도

. (문서 [ '부스트'] 값은 100, 10 사이) .so 문제는 그루비야. 숫자가 클 경우 0.0으로 반올림됩니다. 나는 어떻게해야합니까? 감사합니다.

+0

'floor (_score)'를 실행하면'0.98977035'가 0으로 표시되고 0이 0이면 0이됩니다. –

+0

그냥 예일뿐입니다! 하지만 당신 말이 맞아요! 나는 "script": "ceil (_score)"'및 다른 함수를 시도했지만 결과는 동일합니다. – majran

답변

1

해결책을 찾았지만 문제는 아닙니다. floor(_score*10.0)을 사용하면 정답을 반환합니다! (이유는 모르겠 음) 및 약 "script": "doc['boost'].value" 플로트를 정수로 변환합니다 (아직 플로트 문제를 해결할 수 없음).

관련 문제