Database/Opensearch

Opensearch 유사도 검색

daeunnniii 2024. 11. 21. 18:57
728x90
반응형

이전 게시글

  • 앞서 PDF 문서를 Text로 변환하여 Custom analyzer 적용하여 인덱싱하였음.

https://daeunnniii.tistory.com/206

 

Opensearch Tokenizer, Analyzer와 Custom Analyzer 적용

1. Opensearch AnalyzerOpensearch에 텍스트 입력 시 필드를 인덱싱하고 Documents화 할 때 Lucene 엔진에 의해 텍스트가 분석되어 입력됨.이때 텍스트를 분석하는 엔진을 Analyzer라고 함.Lucene 에서 제공하는 An

daeunnniii.tistory.com

 

Opensearch 유사도 검색

1. More like this 쿼리

  • More Like This (MLT) 쿼리는 입력으로 주어진 document 집합과 비슷한 document들을 찾는다.

Input Document와 관련된 파라미터

  • like: MLT 쿼리에서 유일한 필수 파라미터이며, 융통성 있는 문법을 따른다. 즉, 자유로운 형식의 텍스트를 입력할 수도, 하나 혹은 여러 document를 지정할 수도 있다. document를 지정하는 방법은 Multi GET API와 비슷하다. document를 지정할 때 텍스트는 각 document request에 의해 오버라이드 되지 않는다면(중복되지 않는다면) 아래에 설명되어 있는 파라미터인 fields에서 가져온다.
    • 텍스트는 해당 필드의 analyzer에 의해 분석되나, 오버라이드 될 수 있다.
  • unlike: like와 결합하여 선택되지 않을 term들을 지정하는데 사용할 수 있다. 다시 말해서, like:"Apple", unlike: "cake" 처럼 쓸 수 있다. 문법은 like와 동일하다.
  • fields: 분석에 사용할 텍스트 필드들의 목록을 지정한다. 기본적으로 메타데이터를 제외한, term-level 쿼리에 사용될 수 있는 필드들이 포함된다.

Term 선택과 관련된 파라미터

  • max_query_terms: 최대 몇 개의 텀이 선택될지 정하는 파라미터. 개수를 올리면 정확도는 올라가나 쿼리 성능은 떨어진다. 기본값은 25이다.
  • min_term_freq: term과 문서의 tf를 계산했을 때, tf가 몇 이하면 무시할지 정하는 파라미터. 기본값은 2이다.
  • min_doc_freq: term이 몇 개 이하의 document에서 나왔을 때 무시할 지 정하는 파라미터. 기본값은 5이다.
  • max_doc_freq: term이 몇 개 이상의 document에서 나왔을 때 무시할 지 정하는 파라미터. 모든 문서에서 등장하는 텀은 별 가치가 없다. 기본값은 Integer.MAX_VALUE이다.
  • min_word_length: term의 최소 길이. 기본값은 0이다.
  • max_word_length: term의 최대 길이. 기본값은 제한없음(0)
  • stop_words: 불용어 리스트를 지정한다.
  • analyzer: 자유 형식의 텍스트를 어떤 analyzer로 분석할지 지정한다. 기본은 fields의 첫번째 필드의 analyzer이다.

query 형성에 관련된 파라미터

  • minimum_should_match: 논리합 쿼리를 만들 때 몇 개의 term이 맞아야 하는지 결정한다. 문법은 minimum should match와 동일하며 기본은 30퍼센트이다.
  • fail_on_unsupported_field: 지원되지 않는 타입이 있을 때(text나 keyword가 아닌 타입) 쿼리를 실패시킬 지 혹은 무시할지 결정하는 파라미터 기본은 true이다.
  • boost_terms: 각 term에 대한 tf-idf 계산용 부스트 파라미터. 기본은 사용 안함(0)이다.
  • include: Input document가 결과에 포함될지 안될지 결정하는 파라미터. 기본은 false이다.
  • boost: 전체 쿼리에 대한 부스트 파라미터. 기본은 1이다.

2. Opensearch 유사도 검색 수행

  • 위에서 구축한 pdf_document 인덱스를 대상으로 유사도 검색을 수행
INDEX_NAME = "pdf_documents"

query = {
    "query": {
        "more_like_this": {
            "fields": ["content"],  # 유사도를 비교할 필드
            "like": "DATA RESPONSIBILITY IN HUMANITARIAN ACTION",        # 비교할 텍스트
            "min_term_freq": 1,      # 최소 등장 빈도 수
            "min_doc_freq": 1    # 최소 문서 등장 빈도 수
        }
    }
}

response = client.search(index=INDEX_NAME, body=query)
print("Similar documents:", response['hits']['hits'][0])

'''
########### 결과 ############
Similar documents: 
{
    '_index': 'pdf_documents', 
    '_id': 'oK4cQpMB83BwOIdmhHfk',
    '_score': 2.0298994,
    '_source': {
        'content': 'THE CENTRE FOR HUMANITARIAN DATA\n\nGUIDANCE NOTE SERIES\n\nDATA RESPONSIBILITY IN HUMANITARIAN ACTION\n\nDATA INCIDENT MANAGEMENT\n\nKEY TAKEAWAYS:\n\n•  Humanitarian data incidents are events involving the management of data that have caused \nharm or have the potential to cause harm to crisis-affected people, organizations and their \noperations, and other individuals or groups.\n\n•  Examples of humanitarian data incidents include physical breaches of infrastructure, \n\nunauthorised disclosure of data, and the use of beneficiary data for non-humanitarian purposes, \namong others.\n\n•  A data incident has four aspects: (i) a threat source, (ii) a threat event, (iii) a vulnerability and (iv) \n\nan adverse impact. \n\n•  There are five steps to responding to data incidents: (i) notification, (ii) classification, (iii) \n\ntreatment, and (iv) closure of the incident, as well as (v) learning.\n\nWHAT IS A DATA INCIDENT IN HUMANITARIAN RESPONSE ?\n\nIn the humanitarian sector, data incidents are events involving the management of data that have caused \nharm or have the potential to cause harm to crisis affected populations, humanitarian organisations \nand their operations, and other individuals or groups. These events can exploit or exacerbate existing \nvulnerabilities.1 In some cases,
... (생략) ...

'''
  • 검색한 텍스트가 포함된 아래 문서를 결과로 잘 반환하였음.

Todo

  • 이후 참고할 문서 : Opensearch에서 K-NN을 활용한 유사도 검색

https://opensearch.org/blog/similar-document-search/

 

Similar document search with OpenSearch

OpenSearch is a community-driven, Apache 2.0-licensed open source search and analytics suite that makes it easy to ingest, search, visualize, and analyze data.

opensearch.org

 

728x90
반응형