Azure

[Azure] AI Search - SynonymMap 적용

비번변경 2024. 12. 20. 11:57

개요

2024.12.02-[Azure] AI Search - Synonym map2024.12.03-[Azure] AI Search - Synonym map 생성/조회/삭제에서 SynonymMap의 개념과 python으로 다루는 방법을 간단하게 알아보았다. 이번 글에선 SynonymMap을 실제로 인덱스에 적용하는 방법을 정리해 둔다.

 

 

테스트 데이터

먼저 아래와 같은 데이터가 있다고 하자.

이 데이터를 저장하기 위해서 아래와 같은 필드를 가진 스키마로 인덱스를 생성했다.

{
  "name": "testIndex",
  "fields": [
    {
      "name": "docid",
      "type": "Edm.String",
      "key": true,
      "retrievable": true,
      "stored": true,
      "searchable": false,
      "filterable": true,
      "sortable": false,
      "facetable": false,
      "synonym_maps": [
        
      ]
    },
    {
      "name": "WE_KORTEXT",
      "type": "Edm.String",
      "key": false,
      "retrievable": true,
      "stored": true,
      "searchable": true,
      "filterable": true,
      "sortable": false,
      "facetable": false,
      "analyzer": "ko.microsoft",
      "synonym_maps": [
        
      ]
    }
  ],
  ... 생략 ...
 }

 

 

데이터 검색 - SynonymMap 적용 전

SynonymMap를 적용하지 않은 상태에서 먼저 텍스트 검색을 해보겠다. SW라는 키워드로 검색을 해보니 다음과 같은 결과가 돌아왔다.

from azure.core.credentials import AzureKeyCredential
from azure.search.documents import SearchClient

service_endpoint = os.environ["AZURE_SEARCH_SERVICE_ENDPOINT"]
index_name = os.environ["AZURE_SEARCH_INDEX_NAME"]
key = os.environ["AZURE_SEARCH_API_KEY"]

search_client = SearchClient(service_endpoint, index_name, AzureKeyCredential(key))

# 검색
documents = search_client.search(search_text="위생", search_fields=["WE_KORTEXT"], select=["WE_KORTEXT"])

검색 시에는 search_text로 검색할 키워드를, search_fields로 검색할 대상 컬럼을 지정할 수 있다. select 매개변수는 결과로 조회할 컬럼에 해당한다.

 

 

SynonymMap 생성 및 적용

SynonymMap 생성

예시 데이터에서 위생이라는 단어와 수질이라는 단어를 동일한 것을 취급하려고 한다. 아래와 같이 동등성 규칙을 포함한 SynonymMap을 생성한다.

name = 'test-synonym'
synonyms = [
    "위생, 수질",
]
synonym_map = SynonymMap(name=name, synonyms=synonyms)
index_client = SearchIndexClient(endpoint=search_endpoint, credential=credential)
result = index_client.create_or_update_synonym_map(synonym_map)

 

SynonymMap 적용

생성한 SynonymMap을 인덱스의 WE_KORTEXT 필드에 적용한다.

# 기존 인덱스 정보
index_client = SearchIndexClient(endpoint=search_endpoint, credential=credential)
index_info = index_client.get_index(index_name).as_dict()

# fields에 synonymMap 적용한 스키마 정의
for i in index_info['fields']:
    if i['name'] == 'WE_KORTEXT':
        i['synonym_maps'] = [synonym_name] if synonym_name else []

# 신규 SearchIndex 객체 생성
todb_index = SearchIndex.from_dict(index_info)

# 인덱스 갱신
index_client.create_or_update_index(todb_index)

갱신한 인덱스의 스키마를 다시 확인해 보면,

{
  'name': 'testIndex',
  'fields': [
    {
      'name': 'docid',
      'type': 'Edm.String',
      'key': True,
      'retrievable': True,
      'stored': True,
      'searchable': False,
      'filterable': True,
      'sortable': False,
      'facetable': False,
      'synonym_maps': [
        
      ]
    },
    {
      'name': 'WE_KORTEXT',
      'type': 'Edm.String',
      'key': False,
      'retrievable': True,
      'stored': True,
      'searchable': True,
      'filterable': True,
      'sortable': False,
      'facetable': False,
      'analyzer': 'ko.microsoft',
      'synonym_maps': [
        'test-synonym'
      ]
    }
  ],
  ... 생략 ...
 }

WE_KORTEXT라는 문자열 필드에 test-synonym이라는 값이 추가된 것을 확인할 수 있다.

 

 

데이터 검색 - SynonymMap 적용

SynonymMap을 적용하기 전과 동일하게 위생이라는 단어로 검색을 해보겠다.

from azure.core.credentials import AzureKeyCredential
from azure.search.documents import SearchClient

service_endpoint = os.environ["AZURE_SEARCH_SERVICE_ENDPOINT"]
index_name = os.environ["AZURE_SEARCH_INDEX_NAME"]
key = os.environ["AZURE_SEARCH_API_KEY"]

search_client = SearchClient(service_endpoint, index_name, AzureKeyCredential(key))

# 검색
documents = search_client.search(search_text="위생", search_fields=["WE_KORTEXT"], select=["WE_KORTEXT"])

수질이라는 단어도 포함한 결과가 조회되는 것을 확인할 수 있다.

반대로 키워드를 수질로 지정해도 '위생'을 포함한 결과가 조회된다.

 

 

참고 문서

https://learn.microsoft.com/ko-kr/python/api/azure-search-documents/azure.search.documents.searchclient?view=azure-python#azure-search-documents-searchclient-search