2015-02-04 2 views
1

Fubar가없는 문서보다 항상 앞에 오는 쿼리 시간에 결정되는 특정 값으로 설정되는 필드가있는 ElasticSearch 쿼리의 결과를 원합니다 값.ElasticSearch 쿼리에서 마술 번호를 향상시키지 않으시겠습니까?

예를 들어 쿼리 시간에 fubar가 1, 5 또는 10으로 설정된 문서가 다른 모든 문서보다 우선해야한다고 결정했습니다.

지금 나는 function_score를 사용하여 fubar를 "in"값 목록으로 필터링하고 필터에 대해 boost를 10x로 설정하여이 작업을 수행합니다. 그런 다음 쿼리 점수와이 증가 된 필터가 합산됩니다.

해킹처럼 느껴진다. 100 배 향상이 필요 없다는 것을 어떻게 확실히 알 수 있습니까? 가능한 최대 문서 스코어를 가정하지 않는 "깨끗한"방법이 있습니까? 다른 말로하면 '마법의'부스트 숫자를 피하는 방법이 있습니까?

+0

어쩌면 이것은 바보 같은 질문 일 수 있습니다. 그러나 해당 필드를 정렬하여 수행 할 수는 없습니까? –

+0

사실 다음에 정렬을한다는 것은 잠재적으로 수백만 개의 레코드를 반복해야하기 때문에 작동하지 않을 것입니다. 탄력성 검색을 먼저 필드별로 정렬하는 것을 의미하는 경우 어떻게하는지 알려주세요! –

+0

슬로안, 당신이 옳았다 - 내가 질문을 언급했듯이 그것은 소팅으로 해결 될 수있다. 질문을 다시 시작했습니다. 여전히 정렬 할 수 있습니까? –

답변

2

EDITED : 쿼리가 OP의 명확한 질문과 일치하도록 수정되었습니다.

{ 
    "query" : {"match_all" : {}}, 
    "sort" : [ 
    {"_script" : { 
     "script" : "[1, 10, 15].contains(doc['fubar'].value.toInteger()) ? 1 : 0", 
     "type" : "number", 
     "order" : "desc" 
    }}, 
    "_score" 
    ] 
} 

이런 종류의 각 문서에 fubar 정렬 종류의 따라, 10, 또는 15 일 같은지 여부를 동적으로 확인하기 위해 지정된 스크립트에 의존합니다. 이 예제에서는 여기에 결과를 1 또는 0으로 매핑하기로했지만, 다른 방법으로 시도 할 수 있습니다. 다음 샘플 데이터를 사용하여 :

{"name":"Alice", "fubar":1} 
{"name":"Bob", "fubar":21} 
{"name":"Carol", "fubar":33} 
{"name":"David", "fubar":17} 
{"name":"Evelyn", "fubar":5} 
{"name":"Fred", "fubar":10} 

나는 다음과 같은 결과를 얻었다 (외부 비트는 읽기 쉽도록 잘립니다) : 앨리스와 프레드가 원하는 동작 인, 먼저 반환받을 것을

"hits" : [ { 
    "_index" : "test", 
    "_type" : "test", 
    "_id" : "1", 
    "_score" : 1.0, 
    "_source":{"fubar": 1, "name": "Alice"}, 
    "sort" : [ 1.0, 1.0 ] 
}, { 
    "_index" : "test", 
    "_type" : "test", 
    "_id" : "6", 
    "_score" : 1.0, 
    "_source":{"fubar": 10, "name": "Fred"}, 
    "sort" : [ 1.0, 1.0 ] 
}, { 
    "_index" : "test", 
    "_type" : "test", 
    "_id" : "4", 
    "_score" : 1.0, 
    "_source":{"fubar": 17, "name": "David"}, 
    "sort" : [ 0.0, 1.0 ] 
}, { 
    "_index" : "test", 
    "_type" : "test", 
    "_id" : "5", 
    "_score" : 1.0, 
    "_source":{"fubar": 5, "name": "Evelyn"}, 
    "sort" : [ 0.0, 1.0 ] 
}, { 
    "_index" : "test", 
    "_type" : "test", 
    "_id" : "2", 
    "_score" : 1.0, 
    "_source":{"fubar": 21, "name": "Bob"}, 
    "sort" : [ 0.0, 1.0 ] 
}, { 
    "_index" : "test", 
    "_type" : "test", 
    "_id" : "3", 
    "_score" : 1.0, 
    "_source":{"fubar": 33, "name": "Carol"}, 
    "sort" : [ 0.0, 1.0 ] 
} ] 

참고. 평범한 경우 모든 문서의 점수는 1.0이므로 보조 정렬 기준으로 _score을 사용해도 아무런 효과가 없지만 실제 데이터 (실제 득점 포함)는이를 고려합니다.

+0

rchang : 사과, 나는 질문을 잘못 진술했다. 내가 묻기로 한 질문을 편집했습니다. 당신의 대답은 더 이상 효과가 없을 것입니다, 그렇죠? –

+0

@ DanSandberg 이해 - 이해를 돕기 위해 답변을 업데이트했습니다. – rchang

+0

스크립트로 정렬 한 후 텍스트 쿼리 점수 (일반 _score)로 정렬 할 수 있습니까? 그렇다면 당신은 내 질문에 대답했고 나는 많은 의무를진다. –

관련 문제