More like this
More like this (유사 문서 검색)
more_like_this 쿼리를 사용하면 주어진 하나 이상의 문서와 유사한 문서를 찾을 수 있어요. 추천 엔진, 콘텐츠 발견, 데이터셋 안의 관련 항목 식별에 유용해요.
출처: 문서
본문
more_like_this 쿼리를 사용하면 주어진 하나 이상의 문서와 유사한 문서를 찾을 수 있어요. 추천 엔진, 콘텐츠 발견, 데이터셋 안에서 관련 항목을 식별하는 데 유용해요. more_like_this 쿼리는 입력 문서나 텍스트를 분석해서 그 내용을 가장 잘 대표하는 용어를 선택해요. 그런 다음 이 중요한 용어를 포함한 다른 문서를 검색해요.
사전 요구 사항 (Prerequisites)
more_like_this 쿼리를 사용하기 전에 대상 필드가 인덱싱되어 있고 데이터 타입이 text 또는 keyword인지 확인하세요. like 섹션에서 문서를 참조하면 OpenSearch는 해당 문서의 내용에 접근할 수 있어야 해요. 보통 기본적으로 활성화된 _source 필드를 통해 이 작업이 이루어져요. _source가 비활성화되어 있다면 필드를 개별적으로 저장하거나 term_vector 데이터를 저장하도록 구성해야 해요. 문서를 인덱싱할 때 term_vector 정보를 저장해 두면 more_like_this 쿼리가 크게 빨라져요. 엔진이 쿼리 시점에 필드 텍스트를 다시 분석하지 않고 중요한 용어를 바로 가져올 수 있기 때문이에요.
예제: term vector 미적용
다음 매핑을 사용해 articles-basic이라는 인덱스를 생성하세요.
PUT /articles-basic
{
"mappings": {
"properties": {
"title": { "type": "text" },
"content": { "type": "text" }
}
}
}
샘플 문서를 추가하세요.
POST /articles-basic/_bulk
{ "index": { "_id": 1 }}
{ "title": "Exploring the Sahara Desert", "content": "Sand dunes and vast landscapes." }
{ "index": { "_id": 2 }}
{ "title": "Amazon Rainforest Tour", "content": "Dense jungle and exotic wildlife." }
{ "index": { "_id": 3 }}
{ "title": "Mountain Adventures", "content": "Snowy peaks and hiking trails." }
다음 요청으로 쿼리를 실행하세요.
GET /articles-basic/_search
{
"query": {
"more_like_this": {
"fields": ["content"],
"like": "jungle wildlife",
"min_term_freq": 1,
"min_doc_freq": 1
}
}
}
more_like_this 쿼리는 content 필드에서 jungle과 wildlife 용어를 검색하며, 이는 문서 하나만 일치해요:
{
...
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.9616582,
"hits": [
{
"_index": "articles-basic",
"_id": "2",
"_score": 1.9616582,
"_source": {
"title": "Amazon Rainforest Tour",
"content": "Dense jungle and exotic wildlife."
}
}
]
}
}
예제: term vector 최적화
다음 매핑을 사용해 articles-optimized라는 인덱스를 생성하세요.
PUT /articles-optimized
{
"mappings": {
"properties": {
"name": {
"type": "text",
"term_vector": "with_positions_offsets"
},
"alias": {
"type": "text",
"term_vector": "with_positions_offsets"
},
"quote": {
"type": "text",
"term_vector": "with_positions_offsets"
}
}
}
}
최적화된 인덱스에 샘플 문서를 넣으세요.
POST /articles-optimized/_bulk
{ "index": { "_id": "a1" } }
{ "name": "Diana", "alias": "Wonder Woman", "quote": "Justice will come when it is deserved." }
{ "index": { "_id": "a2" } }
{ "name": "Clark", "alias": "Superman", "quote": "Even in the darkest times, hope cuts through." }
{ "index": { "_id": "a3" } }
{ "name": "Bruce", "alias": "Batman", "quote": "I am vengeance. I am the night. I am Batman!" }
quote 필드에 “dark”와 “night”와 유사한 용어가 포함된 문서를 찾으세요:
GET /articles-optimized/_search
{
"query": {
"more_like_this": {
"fields": ["quote"],
"like": "dark night",
"min_term_freq": 1,
"min_doc_freq": 1
}
}
}
more_like_this 쿼리는 dark와 night 용어를 검색하고 다음 결과를 반환해요:
{
...
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.2363393,
"hits": [
{
"_index": "articles-optimized",
"_id": "a3",
"_score": 1.2363393,
"_source": {
"name": "Bruce",
"alias": "Batman",
"quote": "I am vengeance. I am the night. I am Batman!"
}
}
]
}
}
예제: 여러 문서와 텍스트 입력 사용
more_like_this 쿼리는 like 파라미터에 여러 소스를 제공할 수 있게 해줘요. 자유 텍스트와 인덱스의 문서를 함께 조합할 수 있어요. 여러 예시의 관련성 신호를 검색에 결합하고 싶을 때 유용해요. 다음 예시에서는 사용자 지정 문서를 직접 제공해요. 추가로 heroes 인덱스에 있는 ID 5 문서도 포함돼요:
GET /articles-optimized/_search
{
"query": {
"more_like_this": {
"fields": ["name", "alias"],
"like": [
{
"doc": {
"name": "Diana",
"alias": "Wonder Woman",
"quote": "Courage is not the absence of fear, but the triumph over it."
}
},
{
"_index": "heroes",
"_id": "5"
}
],
"min_term_freq": 1,
"min_doc_freq": 1,
"max_query_terms": 25
}
}
}
반환된 결과에는 쿼리에 제공된 name과 alias 필드와 가장 유사한 문서가 담겨 있어요:
{
...
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 2.140194,
"hits": [
{
"_index": "articles-optimized",
"_id": "a1",
"_score": 2.140194,
"_source": {
"name": "Diana",
"alias": "Wonder Woman",
"quote": "Justice will come when it is deserved."
}
},
{
"_index": "articles-optimized",
"_id": "a2",
"_score": 1.1596459,
"_source": {
"name": "Clark",
"alias": "Superman",
"quote": "Even in the darkest times, hope cuts through."
}
}
]
}
}
이 패턴은 아직 완전히 인덱싱되지 않은 새로운 개념을 바탕으로 결과를 상향(boost)하면서도, 기존에 인덱싱된 문서의 지식을 함께 결합하고 싶을 때 사용해요.
파라미터 (Parameters)
more_like_this 쿼리에서 필수 파라미터는 like 하나뿐이에요. 나머지 파라미터는 기본값이 있지만 세밀하게 조정할 수 있어요. 주요 파라미터 범주는 다음과 같아요.
문서 입력 파라미터 (Document input parameters)
다음 표는 문서 입력 파라미터를 정리한 것이에요.
Parameter Required/Optional Data type Description
like | 필수 | 문자열 또는 객체 배열 | 유사한 문서를 찾을 텍스트나 문서를 정의해요. 자유 텍스트, 인덱스의 실제 문서, 인위적으로 만든 문서를 입력할 수 있어요. 재정의하지 않으면 필드에 연결된 analyzer가 텍스트를 처리해요.
unlike | 선택 | 문자열 또는 객체 배열 | 용어가 쿼리에 영향을 주지 않아야 할 텍스트나 문서를 제공해요. 부정 예시를 지정할 때 유용해요.
fields | 선택 | 문자열 배열 | 텍스트 분석에 사용할 필드 목록을 지정해요. 지정하지 않으면 모든 필드를 사용해요.
용어 선택 파라미터 (Term selection parameters)
Parameter Required/Optional Data type Description
max_query_terms | 선택 | 정수(Integer) | 입력에서 선택할 최대 용어 수를 설정해요. 값이 클수록 정확도는 높아지지만 실행이 느려져요. 기본값은 25예요.
min_term_freq | 선택 | 정수(Integer) | 입력에서 이 값보다 적게 나타난 용어는 무시돼요. 기본값은 2예요.
min_doc_freq | 선택 | 정수(Integer) | 이 값보다 적은 문서에 나타난 용어는 무시돼요. 기본값은 5예요.
max_doc_freq | 선택 | 정수(Integer) | 이 제한보다 많은 문서에 나타난 용어는 무시돼요. 너무 흔한 단어를 피할 때 유용해요. 기본값은 무제한(231 - 1)이에요.
min_word_length | 선택 | 정수(Integer) | 이 값보다 짧은 단어는 무시해요. 기본값은 0이에요.
max_word_length | 선택 | 정수(Integer) | 이 값보다 긴 단어는 무시해요. 기본값은 무제한이에요.
stop_words | 선택 | 문자열 배열 | 용어 선택 시 완전히 무시할 단어 목록을 정의해요.
analyzer | 선택 | 문자열(String) | 입력 텍스트를 처리할 때 사용할 사용자 지정 analyzer예요. 기본값은 fields에 나열된 첫 번째 필드의 analyzer예요.
쿼리 구성 파라미터 (Query formation parameters)
Parameter Required/Optional Data type Description
minimum_should_match | 선택 | 문자열(String) | 최종 쿼리에서 일치해야 하는 최소 용어 수를 지정해요. 값은 백분율이나 고정 숫자가 될 수 있어요. 재현율(recall)과 정확도(precision)의 균형을 세밀하게 조정하는 데 도움이 돼요. 기본값은 30%예요.
fail_on_unsupported_field | 선택 | 불리언(Boolean) | 대상 필드 중 하나가 호환되는 타입(text 또는 keyword)이 아닐 때 오류를 발생시킬지 결정해요. false로 설정하면 지원되지 않는 필드를 조용히 건너뜁니다. 기본값은 true예요.
boost_terms | 선택 | 실수(Float) | 선택된 용어에 TF–IDF(term frequency–inverse document frequency) 가중치를 기반으로 상향(boost)을 적용해요. 0보다 큰 값이면 지정한 계수로 용어 상향이 활성화돼요. 기본값은 0이에요.
include | 선택 | 불리언(Boolean) | true이면 like에 제공된 원본 문서가 결과 hits에 포함돼요. 기본값은 false예요.
boost | 선택 | 실수(Float) | 전체 more_like_this 쿼리의 관련성 점수를 곱해요. 기본값은 1.0이에요.