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이에요.

더 알아보기 (Learn more)