2017-09-11 2 views
0

내가 현재 다음과 같습니다 ES에서 중첩 된 객체 interest_scores이 점수 것은 : 내가 실행 검색어를 입력하면Elasticsearch 기능에서 사용하는 중첩 된 개체 값이

[{ 
    username: 'Somebody', 
    interest_scores: [ 
     { name: 'Running', score: 10 } 
     { name: 'Food and drinks', score: 21 } 
    ] 
}, 
{ 
    username: 'SomebodyElse', 
    interest_scores: [ 
     { name: 'Running', score: 7 } 
     { name: 'Food and drinks', score: 29 } 
    ] 
}] 

나는이 가장 높은 사용자를 싶습니다 score ()을 실행하면 가장 먼저 반환됩니다.

이 방법은 Function Score Query을 사용하는 것이지만 기능/스크립트에서 일치하는 검색어를 사용하는 방법을 잘 모르겠습니다. 제가 생각하기에 쿼리는 "Running"이라는 관심이있는 모든 문서를 반환 할 것이고 interest_scores.{match}.score과 같은 것을 사용하여 문서 점수에 추가하거나 곱할 수 있습니다.

위의 사항에 대한 도움을 주시면 대단히 감사하겠습니다.

요청으로

는, 여기에 매핑 :

{ 
 
    "influencers": { 
 
    "mappings": { 
 
     "influencer": { 
 
     "properties": { 
 
      "email": { 
 
      "type": "text", 
 
      "fields": { 
 
       "keyword": { 
 
       "type": "keyword", 
 
       "ignore_above": 256 
 
       } 
 
      } 
 
      }, 
 
      "gender": { 
 
      "type": "text", 
 
      "fields": { 
 
       "keyword": { 
 
       "type": "keyword", 
 
       "ignore_above": 256 
 
       } 
 
      } 
 
      }, 
 
      "geo": { 
 
      "type": "geo_point" 
 
      }, 
 
      "hashtags": { 
 
      "type": "text", 
 
      "fields": { 
 
       "keyword": { 
 
       "type": "keyword", 
 
       "ignore_above": 256 
 
       } 
 
      } 
 
      }, 
 
      "id": { 
 
      "type": "text", 
 
      "fields": { 
 
       "keyword": { 
 
       "type": "keyword", 
 
       "ignore_above": 256 
 
       } 
 
      } 
 
      }, 
 
      "interest_scores": { 
 
      "type": "nested", 
 
      "properties": { 
 
       "name": { 
 
       "type": "text", 
 
       "fields": { 
 
        "keyword": { 
 
        "type": "keyword", 
 
        "ignore_above": 256 
 
        } 
 
       } 
 
       }, 
 
       "score": { 
 
       "type": "long" 
 
       } 
 
      } 
 
      }, 
 
      "interests": { 
 
      "type": "text", 
 
      "fields": { 
 
       "keyword": { 
 
       "type": "keyword", 
 
       "ignore_above": 256 
 
       } 
 
      } 
 
      }, 
 
      "language": { 
 
      "type": "text", 
 
      "fields": { 
 
       "keyword": { 
 
       "type": "keyword", 
 
       "ignore_above": 256 
 
       } 
 
      } 
 
      }, 
 
      "location": { 
 
      "properties": { 
 
       "city": { 
 
       "type": "text", 
 
       "fields": { 
 
        "keyword": { 
 
        "type": "keyword", 
 
        "ignore_above": 256 
 
        } 
 
       } 
 
       }, 
 
       "country": { 
 
       "type": "text", 
 
       "fields": { 
 
        "keyword": { 
 
        "type": "keyword", 
 
        "ignore_above": 256 
 
        } 
 
       } 
 
       }, 
 
       "country_code": { 
 
       "type": "text", 
 
       "fields": { 
 
        "keyword": { 
 
        "type": "keyword", 
 
        "ignore_above": 256 
 
        } 
 
       } 
 
       }, 
 
       "lat": { 
 
       "type": "float" 
 
       }, 
 
       "lng": { 
 
       "type": "float" 
 
       }, 
 
       "state_code": { 
 
       "type": "text", 
 
       "fields": { 
 
        "keyword": { 
 
        "type": "keyword", 
 
        "ignore_above": 256 
 
        } 
 
       } 
 
       }, 
 
       "subdivision": { 
 
       "type": "text", 
 
       "fields": { 
 
        "keyword": { 
 
        "type": "keyword", 
 
        "ignore_above": 256 
 
        } 
 
       } 
 
       } 
 
      } 
 
      }, 
 
      "network_data": { 
 
      "properties": { 
 
       "facebook": { 
 
       "properties": { 
 
        "url": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "username": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        } 
 
       } 
 
       }, 
 
       "instagram": { 
 
       "properties": { 
 
        "bio": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "engagement": { 
 
        "type": "float" 
 
        }, 
 
        "id": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "picture": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "reach": { 
 
        "type": "long" 
 
        }, 
 
        "url": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "username": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        } 
 
       } 
 
       }, 
 
       "pinterest": { 
 
       "properties": { 
 
        "url": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "username": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        } 
 
       } 
 
       }, 
 
       "twitter": { 
 
       "properties": { 
 
        "bio": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "engagement": { 
 
        "type": "float" 
 
        }, 
 
        "id": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "picture": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "reach": { 
 
        "type": "long" 
 
        }, 
 
        "url": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "username": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        } 
 
       } 
 
       }, 
 
       "youtube": { 
 
       "properties": { 
 
        "bio": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "engagement": { 
 
        "type": "float" 
 
        }, 
 
        "id": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "picture": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "reach": { 
 
        "type": "long" 
 
        }, 
 
        "url": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "username": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "videos": { 
 
        "type": "long" 
 
        }, 
 
        "views": { 
 
        "type": "long" 
 
        }, 
 
        "views_per_video": { 
 
        "type": "float" 
 
        } 
 
       } 
 
       } 
 
      } 
 
      }, 
 
      "networks": { 
 
      "type": "text", 
 
      "fields": { 
 
       "keyword": { 
 
       "type": "keyword", 
 
       "ignore_above": 256 
 
       } 
 
      } 
 
      }, 
 
      "picture": { 
 
      "type": "text", 
 
      "fields": { 
 
       "keyword": { 
 
       "type": "keyword", 
 
       "ignore_above": 256 
 
       } 
 
      } 
 
      }, 
 
      "total_reach": { 
 
      "type": "long" 
 
      }, 
 
      "username": { 
 
      "type": "text", 
 
      "fields": { 
 
       "keyword": { 
 
       "type": "keyword", 
 
       "ignore_above": 256 
 
       } 
 
      } 
 
      } 
 
     } 
 
     } 
 
    } 
 
    } 
 
}

내가 난 단지 키바의 개발 도구에서 테스트하고, 아직 기능 점수 쿼리가없는 - 나는 모든 있나요 다른 필터는 올바르게 작동합니다. 난 그냥 검색어가 interest_scores.name 다음이

다음은 내가 키바의 개발 도구에서 테스트 할 때 작동하는 것 같군 그 interest_scores.name

업데이트의 interest_scores.score으로 안타를 정렬과 일치하면 "말을 찾고 있어요 :

{ 
 
    "query": { 
 
    "nested": { 
 
     "path": "interest_scores", 
 
     "score_mode": "sum", 
 
     "query": { 
 
     "function_score": { 
 
      "query": { 
 
       "match": { "interest_scores.name": "Running" } 
 
      }, 
 
      "script_score": { 
 
      "script": "_score + doc['interest_scores.score'].value" 
 
      } 
 
     } 
 
     } 
 
    } 
 
    } 
 
}

나는 몇 가지 다른 바다와 함께 테스트 한 rch 용어를 사용하면 항상 가장 높은 점수를 반환하지만 이상한 점은 script_score 함수를 제거 할 때 동일한 결과를 얻는다는 것입니다. 아무도 이것이 좋은 해결책인지 아니면 왜 script_score없이 작동하는지 말해 줄 수 있습니까?

+0

매핑과 사용한 쿼리를 추가 할 수 있습니까? – Eli

답변

0

으로 당신은 중첩 된 필드를 기준으로 정렬 할 수 here 설명 :

{ 
    "_source": false, # for inner hits - you can remove it 
    "query": { 
    "nested": { 
     "path": "interest_scores", 
     "filter": { 
     "range": { 
      "interest_scores.score": { 
      "gte": "0" 
      } 
     } 
     }, 
     "inner_hits": {} # for inner hits - you can remove it 
    } 
    }, 
    "sort": { 
    "interest_scores.score": { 
     "order": "desc", 
     "mode": "max", 
     "nested_filter": { 
     "range": { 
      "interest_scores.score": { 
      "gte": "0" 
      } 
     } 
     } 
    } 
    } 
} 

* 당신은 단지 관련 중첩 된 문서를 보여주기 위해 inner_hits 기능을 사용할 수 있습니다,주의하십시오. 내부 히트 문서가 모두 관련된 경우 - 표시된 선을 제거하십시오. 필드 또는 다른 모든 필드 (예 : name 필터링 기준)에서 필터를 사용하십시오. 필드에서 필터를 사용하십시오.

편집 1 : 특정 이름의 정렬 점수를 얻고 싶은 경우에 는 시도는 :

{ 
    "_source": false, 
    "query": { 
    "nested": { 
     "path": "interest_scores", 
     "filter": { 
     "term": { 
      "interest_scores.name": "SCORE_NAME" 
     } 
     }, 
     "inner_hits": {} 
    } 
    }, 
    "sort": { 
    "interest_scores.score": { 
     "order": "desc", 
     "mode": "max", 
     "nested_filter": { 
     "range": { 
      "interest_scores.score": { 
      "gte": "0" 
      } 
     } 
     } 
    } 
    } 
} 

원하는 점수 이름 대신 SCORE_NAME을 넣습니다.

+0

정보를 주셔서 감사합니다. 중첩 된 필드 정렬에 관한 문서를 읽었습니다.하지만 Elasticsearch에게'interest_scores.특정'interest_scores.name'에 대한 점수? 나는 ES에 "이 단어/문구가'interest_scores.name'에서 발견되면'interest_scores.score'를 통해 정렬 할 수 있는지 알고 싶습니다. – ryantbrown

+0

답변을 업데이트했습니다. – Eli

관련 문제