개요
2024.12.02-[Azure] AI Search - Synonym map, 2024.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"])
수질이라는 단어도 포함한 결과가 조회되는 것을 확인할 수 있다.
반대로 키워드를 수질로 지정해도 '위생'을 포함한 결과가 조회된다.
참고 문서