distance_feature 쿼리
distance_feature 쿼리
distance_feature 쿼리를 사용해 특정 날짜나 지리적 지점에 더 가까운 문서의 관련성을 높일 수 있어요. 이는 검색 결과에서 더 최근이거나 가까운 콘텐츠를 우선시하는 데 도움이 됩니다. 예를 들어 더 최근에 제조된 제품에 더 많은 가중치를 부여하거나, 사용자가 지정한 위치에 가장 가까운 항목을 높일 수 있어요.
이 쿼리는 날짜나 위치 데이터를 포함하는 필드에 적용할 수 있어요. 결과를 필터링하지 않으면서 관련성 점수를 개선하기 위해 주로 bool 쿼리의 should 절 안에서 사용됩니다.
출처: 문서
본문
인덱스 구성하기 (Configuring the index)
distance_feature 쿼리를 사용하기 전에 인덱스에 다음 필드 유형 중 하나 이상이 있는지 확인하세요.
- date
- date_nanos
- geo_point
이 예제에서는 distance feature 쿼리를 실행하는 데 사용할 opening_date와 coordinates 필드를 구성해 보겠어요.
PUT /stores
{
"mappings": {
"properties": {
"opening_date": {
"type": "date"
},
"coordinates": {
"type": "geo_point"
}
}
}
}
인덱스에 샘플 문서를 추가해요.
PUT /stores/_doc/1
{
"store_name": "Green Market",
"opening_date": "2025-03-10",
"coordinates": [74.00, 40.70]
}
PUT /stores/_doc/2
{
"store_name": "Fresh Foods",
"opening_date": "2025-04-01",
"coordinates": [73.98, 40.75]
}
PUT /stores/_doc/3
{
"store_name": "City Organics",
"opening_date": "2021-04-20",
"coordinates": [74.02, 40.68]
}
예제: 최신성 기준으로 점수 높이기
다음 쿼리는 store_name이 market과 일치하는 문서를 검색하고 최근에 열린 매장을 높여요.
GET /stores/_search
{
"query": {
"bool": {
"must": {
"match": {
"store_name": "market"
}
},
"should": {
"distance_feature": {
"field": "opening_date",
"origin": "2025-04-07",
"pivot": "10d"
}
}
}
}
}
응답에는 일치하는 문서가 포함돼요.
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.2372394,
"hits": [
{
"_index": "stores",
"_id": "1",
"_score": 1.2372394,
"_source": {
"store_name": "Green Market",
"opening_date": "2025-03-10",
"coordinates": [
74,
40.7
]
}
}
]
}
}
예제: 지리적 근접성 기준으로 점수 높이기
다음 쿼리는 store_name이 market과 일치하는 문서를 검색하고 주어진 origin 지점에 더 가까운 결과를 높여요.
GET /stores/_search
{
"query": {
"bool": {
"must": {
"match": {
"store_name": "market"
}
},
"should": {
"distance_feature": {
"field": "coordinates",
"origin": [74.00, 40.71],
"pivot": "500m"
}
}
}
}
}
응답에는 일치하는 문서가 포함돼요.
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.2910118,
"hits": [
{
"_index": "stores",
"_id": "1",
"_score": 1.2910118,
"_source": {
"store_name": "Green Market",
"opening_date": "2025-03-10",
"coordinates": [
74,
40.7
]
}
}
]
}
}
파라미터 (Parameters)
다음 표는 distance_feature 쿼리가 지원하는 모든 최상위 파라미터를 나열해요.
- field (필수): 거리 계산에 사용되는 필드의 이름이에요.
index: true(기본값)와doc_values: true(기본값)인 date, date_nanos 또는 geo_point 필드여야 해요. - origin (필수): 거리 계산에 사용되는 원점입니다. date 필드에는 날짜나 날짜 수학 표현(예:
now-1h)을, geo_point 필드에는 지오포인트를 사용해요. - pivot (필수): 점수가 boost 값의 절반을 받는 origin으로부터의 거리예요. date 필드에는 시간 단위(예:
10d)를, 지리 필드에는 거리 단위(예:1km)를 사용해요. 자세한 내용은 Units를 참고하세요. - boost (선택): 일치하는 문서의 관련성 점수에 대한 배율이에요. 음이 아닌 부동소수점이어야 해요. 기본값은 1.0이에요.
점수 계산 방법 (How scores are calculated)
distance_feature 쿼리는 다음 공식을 사용해 문서의 관련성 점수를 계산해요.
score = boost · pivot / (pivot + distance) | 여기서 distance는 origin과 필드 값의 절대 차이예요.
비경쟁 히트 건너뛰기 (Skipping non-competitive hits)
function_score 쿼리 같은 다른 점수 수정 쿼리와 달리 distance_feature 쿼리는 전체 히트 추적(track_total_hits)이 비활성화되어 있을 때 비경쟁 히트를 효율적으로 건너뛰도록 최적화되어 있어요.