2016-07-22 1 views
0

rate 속성을 포함하는 많은 문서가 허용 범위의 최소/최대 범위를 포함하는 배열입니다.Elasticsearch : 최대/최소값을 가진 배열을 기반으로 범위에 대한 점수를 채점하는 방법

{ "rate": [250, 700] } 
는 는 지금은 예를 들어, 다른 범위를 제공하는 쿼리를 수행하고자하는

:

잘 작동하고 항상 범위 내에서 제공되는 값 중 적어도 하나가 값을 반환
{ 
    "bool": { 
    "must": [ 
     "range": { 
     "rate": { "from": 100, "to": 500 } 
     } 
    ] 
    } 
} 

은 무엇 인 내가 원하는.

그러나 모든 결과에 대해 점수는 같습니다. 값이 문서의 값과 같거나 몇 자리 숫자의 범위를 벗어나는 것이 중요하지 않습니다. 아래 그림과 같이 :

{ 
    "_id": "one", 
    "_score": 1", 
    "_source": { "rate": [250,750] } 
}, 
{ 
    "_id": "two", 
    "_score": 1", 
    "_source": { "rate": [200,350] } 
}, 
{ 
    "_id": "three", 
    "_score": 1", 
    "_source": { "rate": [500,750] } 
} 

이렇게 다른 범위를 제공하는 범위 검색을 향상시킬 방법이 있습니까?

답변

0

range은 암시 적으로 예 또는 아니요 질문입니다. 실제로 부스터가 아닌 다른 무엇보다 점수를 올리는 것은 이상한 일입니다. (예를 들어, 점수가 올라간다면 점수를 올릴 수 있지만 점수가 없으면 점수는 올라갑니다.) 따라서 range 쿼리 이 필터 컨텍스트에서 사용하는 것이 가장 좋습니다.

"query": { 
    "bool": { 
    "filter": [ 
     { 
     "range": { 
      "rate": { "gte": 100, "lte": 500 } 
     } 
     } 
    ] 
    } 
} 

정말 도움이되지 않는

(구문 ES 2.0을 가정), 그러나 당신이하고있는 요청을 할 수있는 좋은 방법입니다.

당신이 물어 보는 바에 따르면 문서의 원래 값을 기준으로 가중치를 넣고 싶습니다. 이것은 보다 작음 값이 범위를 벗어날 가능성이있는 값을 가진 배열이고 nested 개체가 아니기 때문에 항상 배열로 처리됩니다. 즉, 무시한 채로 수동으로 다시 제외해야합니다. 결과).

완전 맞춤 스코어링은 (네이티브 또는 기타) 스크립트가 필요하며 스크립트 점수로 쉽게 수행 할 수 있습니다.

값이 문서의 값과 같거나 몇 자리 숫자의 범위에 해당하는지는 중요하지 않습니다.

첫 번째 부분이 의미하는 바를 실제로 이해하지 못합니다. 하나의 일치가 적게 또는 더 많이 무게를 내고 싶습니까? 가장자리와의 거리가 중요합니까? 상관 관계가 맞습니까? 당신은 not be using inline Groovy scripts in production (사용 파일 기반 스크립트 대신),하지만 위의 작동한다

{ 
    "query": { 
    "bool": { 
     "must": { 
     "function_score": { 
      "functions": [ 
      { 
       "script_score": { 
       "script": { 
        "inline": "doc['rate'].values.findAll { it >= gte && it <= lte }.size()", 
        "lang": "groovy", 
        "params": { 
        "gte": 100, 
        "lte": 500 
        } 
       } 
       } 
      } 
      ], 
      "boost_mode": "replace" 
     } 
     }, 
     "filter": [ 
     { 
      "range": { 
      "rate": { 
       "gte": 100, 
       "lte": 500 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

:

나는 더 많은 경기에 관계없이 그들이 범위에 빠질 경우의, 더 나은 경우를 가정합니다.

+0

감사합니다. @pickypg, 질문을 할 때 범위 쿼리를 추가하는 것을 실제로 잊었습니다 (지금 수정 됨). 아쉽게도 AWS ES 서비스를 사용하면서 Groovy에 액세스 할 수 없습니다. 다른 아이디어로 생각하면 될까요? 도움이된다면 데이터를 다르게 모델링 할 수 있지만 'rate_from'과 'rate_to'와 같은 별도의 값을 갖는 것이 훨씬 더 복잡해졌습니다.100,500을 제공 할 때 100,500 개의 입력이 100 % 일치하고 400,700이 아닌 100,000 개의 입력이 제공 될 때 더 높은 점수를 얻는 범위 또는 비율의 영역과 일치하는 것이 많을 것이라는 아이디어입니다. – zanona