[Elasticsearch] 동의어 처리하기

2025. 3. 4. 22:11·데이터엔지니어링
728x90
반응형

Elasticsearch에 데이터를 넣고, search로 검색을 하면 내가 쓰건 검색엔진과 똑같겠지? 라고 생각하면 오산이다.

기본적인 setting으로는 'ai'는 'ai'만 검색할 수 있고, 'llm'이나 'gpt'같은 유사하게 사용되는 단어는 검색할 수 없다.

혹시나 'ai는'이 포함된 글을 검색하는 것도 불가능하다. 그렇다면 Elasticsearch에서 이러한 동의어는 어떻게 처리할까?


기본 설정에서의 'ai' 검색

  • index 설정 및 document 삽입
# synonyms_test index 생성
PUT /synonyms_test

# _bulk API를 통해 동시에 여러개의 document 삽입
POST /synonyms_test/_bulk
{ "index": { "_id": 1 } }
{ "description": "ai는 자주 사용되는 기술이다." }
{ "index": { "_id": 2 } }
{ "description": "llm은 생성형 모델이다." }

 

  • query를 통한 'ai' 검색
GET /synonyms_test/_search
{
    "query":{
        "match":{
            "description": "ai"
        }
    }
}
{
    "took": 2,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 0,
            "relation": "eq"
        },
        "max_score": null,
        "hits": []
    }
}
  • query를 통한 'ai는' 검색
{
    "query":{
        "match":{
            "description": "ai는"
        }
    }
}
{
    "took": 2,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 0.6548753,
        "hits": [
            {
                "_index": "synonyms_test",
                "_id": "1",
                "_score": 0.6548753,
                "_source": {
                    "description": "ai는 자주 사용되는 기술이다."
                }
            }
        ]
    }
}

 


동의어 설정 후 'ai' 검색

  • /elasticsearch/config/synonyms.txt (파일을 통한 동의어 관리는 elasticsearch 재시작이 필수)
ai, llm
  • icu_tokenizer plugin 설치 (다국어 tokenizer)
/elasticsearch-plugin install analysis-icu
  • 동의어 설정 및 index 생성
PUT /synonyms_test
{
  "settings": {
    "analysis": {
      "filter": {
        "synonym_filter": {
          "type": "synonym",
          "synonyms_path": "synonyms.txt"
        }
      },
      "analyzer": {
        "synonym_analyzer": {
          "tokenizer": "icu_tokenizer",
          "filter": ["lowercase", "synonym_filter"]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "description": {
        "type": "text",
        "analyzer": "synonym_analyzer"
      }
    }
  }
}
  • 동의어 설정 후 'ai' 검색
{
    "query":{
        "match":{
            "description": "ai"
        }
    }
}
{
    "took": 4,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 2,
            "relation": "eq"
        },
        "max_score": 0.31223935,
        "hits": [
            {
                "_index": "synonyms_test",
                "_id": "2",
                "_score": 0.31223935,
                "_source": {
                    "description": "llm은 생성형 모델이다."
                }
            },
            {
                "_index": "synonyms_test",
                "_id": "1",
                "_score": 0.30141023,
                "_source": {
                    "description": "ai는 자주 사용되는 기술이다."
                }
            }
        ]
    }
}

동의어 설정

  • ai, llm은 서로가 양방향으로 교차되어 검색될 수 있음을 의미한다.
  • => 을 사용하면 화살표 방향으로 단어를 대체한다는 의미이다.
  • 파일 형식으로(동의어사전) 동의어를 관리하면 재시작이 필수적이다.
저작자표시 (새창열림)

'데이터엔지니어링' 카테고리의 다른 글

Data Lake, Data Warhouse, Data Mart  (0) 2025.02.28
'데이터엔지니어링' 카테고리의 다른 글
  • Data Lake, Data Warhouse, Data Mart
swwho
swwho
일상을 데이터화하다
  • swwho
    하루한장
    swwho
  • 전체
    오늘
    어제
    • 분류 전체보기 (188)
      • ML_DL (39)
        • MUJAKJUNG (무작정 시리즈) (18)
        • 딥러닝 공부하기 (21)
      • 데이터사이언스 (1)
        • EDA (1)
        • 데이터과학을 위한 통계 (0)
      • 데이터엔지니어링 (2)
      • 논문리뷰 (2)
        • Computer Vision (2)
      • Python 활용하기 (12)
      • 코딩테스트 (127)
        • Python (109)
        • MySQL (14)
      • Git (3)
      • MySQL 활용하기 (0)
      • 일상 이야기 (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
swwho
[Elasticsearch] 동의어 처리하기
상단으로

티스토리툴바