동의어 검색
원본 보기동의어 검색
Elastic Cloud Enterprise 배포에 사용자 정의 동의어 번들을 추가하는 방법을 알아보세요.
동의어는 같거나 비슷한 의미를 공유하는 단어 또는 구입니다. 동의어를 사용해 검색하면 다음이 가능합니다:
- 같은 개념을 다른 용어로 표현한 관련 문서를 찾아 검색 관련성을 높입니다.
- 도메인 특화 어휘를 사용자에게 더 친숙하게 만듭니다.
- 철자 오류와 오타를 정의해 흔한 실수를 자연스럽게 처리합니다.
Elasticsearch에서 동의어를 사용하려면 다음 워크플로를 따르세요:
- 동의어 세트와 규칙 생성: 어떤 용어가 동등한지, 동의어 세트를 어디에 저장할지 정의합니다.
- 분석기 구성: 토큰 필터와 분석기가 이를 사용하도록 구성합니다.
- 테스트 및 적용: 구성이 올바르게 동작하는지 확인합니다.
동의어 규칙은 검색과 색인 과정에서 어떤 용어를 동등하게 취급할지 정의합니다.
동의어 규칙에는 명시적 매핑과 동등 매핑이라는 두 가지 주요 형식이 있습니다.
명시적 매핑은 =>를 사용해 정확한 치환을 지정합니다:
i-pod, i pod => ipod
sea biscuit, sea biscit => seabiscuit
명시적 매핑에서 관계는 단방향입니다. 앞의 예시에서:
i-pod과i pod은ipod으로 치환되지만,ipod은i-pod이나i pod으로 치환되지 않습니다sea biscuit과sea biscit은seabiscuit으로 치환되지만,seabiscuit은sea biscuit이나sea biscit으로 치환되지 않습니다
이는 expand=true일 때 양방향 관계를 만들 수 있는 동등 동의어와 다릅니다.
동등 동의어는 쉼표를 사용해 상호 교환 가능한 용어를 묶습니다:
ipod, i-pod, i pod
foozball, foosball
universe, cosmos
lol, laughing out loud
동등 동의어의 동작은 토큰 필터 구성의 expand 매개변수에 따라 달라집니다:
expand=true인 경우:ipod, i-pod, i pod은 양방향 매핑을 만듭니다:ipod↔i-podipod↔i podi-pod↔i pod
expand=false인 경우:ipod, i-pod, i pod은 모든 용어를 첫 번째 용어를 정규형으로 삼아 매핑합니다:ipod→ipodi-pod→ipodi pod→ipod
동의어 세트와 규칙을 만드는 방법은 여러 가지가 있습니다.
Kibana 사용자 인터페이스를 사용해 동의어 세트와 동의어 규칙을 만들고 관리할 수 있습니다.
UI로 동의어 세트를 만들려면:
- 전역 검색 필드에서 Synonyms를 찾은 다음, 결과에서 Synonyms / Synonyms를 선택합니다.
- Get started를 선택합니다.
- 동의어 세트의 이름을 입력합니다.
- 매칭할 용어를 추가해 편집기에서 동의어 규칙을 추가합니다:
- 여러 동등한 용어를 추가해 Equivalent rules를 추가합니다. 예:
ipod, i-pod, i pod - 단일 용어로 매핑되는 여러 용어를 추가해 Explicit rules를 추가합니다. 예:
i-pod, i pod => ipod
- 여러 동등한 용어를 추가해 Equivalent rules를 추가합니다. 예:
- Save를 선택해 규칙을 저장합니다.
UI는 파일 기반 방식과 동일한 동의어 규칙 형식을 지원합니다. UI를 통해 변경하면 연결된 분석기가 자동으로 다시 로드됩니다.
synonyms API를 사용해 동의어 세트를 관리할 수 있습니다. 동의어 세트를 동적으로 정의하고 수정할 수 있으므로 가장 유연한 방식입니다. API로 동의어 세트를 생성하거나 업데이트하는 예시는 동의어 세트 생성 또는 업데이트 API 예시 페이지를 참고하세요.
동의어 세트를 변경하면 연결된 분석기가 자동으로 다시 로드됩니다.
동의어 세트를 파일에 저장할 수 있습니다.
모든 클러스터 노드에 대해 Elasticsearch 배포판의 구성 디렉터리에 동의어 세트 파일을 업로드해야 합니다. Elastic Cloud Hosted를 사용한다면 사용자 정의 번들로 동의어 파일을 업로드할 수 있습니다.
동의어 파일 예시:
# Blank lines and lines starting with pound are comments.
# Explicit mappings match any token sequence on the left hand side of "=>"
# and replace with all alternatives on the right hand side.
# These types of mappings ignore the expand parameter in the schema.
# Examples:
i-pod, i pod => ipod
sea biscuit, sea biscit => seabiscuit
# Equivalent synonyms may be separated with commas and give
# no explicit mapping. In this case the mapping behavior will
# be taken from the expand parameter in the token filter configuration.
# This allows the same synonym file to be used in different synonym handling strategies.
# Examples:
ipod, i-pod, i pod
foozball, foosball
universe, cosmos
lol, laughing out loud
# If expand==true in the synonym token filter configuration,
# "ipod, i-pod, i pod" is equivalent to the explicit mapping:
ipod, i-pod, i pod => ipod, i-pod, i pod
# If expand==false, "ipod, i-pod, i pod" is equivalent
# to the explicit mapping:
ipod, i-pod, i pod => ipod
# Multiple synonym mapping entries are merged.
foo => foo bar
foo => baz
# is equivalent to
foo => foo bar, baz
기존 동의어 세트를 업데이트하려면 새 파일을 클러스터에 업로드하세요. 동의어 세트 파일은 모든 클러스터 노드에서 동기화된 상태로 유지되어야 합니다.
동의어 세트가 업데이트되면 이를 사용하는 검색 분석기를 reload search analyzers API로 새로 고쳐야 합니다
이러한 수동 동기화와 재로드 때문에 이 방식은 synonyms API를 사용하는 것보다 덜 유연합니다.
토큰 필터 정의에 동의어를 인라인으로 직접 추가해 테스트할 수 있습니다.
인라인 동의어는 프로덕션 사용에 권장되지 않습니다. 인라인 동의어가 많아지면 클러스터 크기가 불필요하게 커지고 성능 문제로 이어질 수 있습니다.
동의어 세트를 만들고 나면, 이를 사용하도록 토큰 필터와 분석기를 구성할 수 있습니다.
동의어 세트는 인덱스에 추가되기 전에 반드시 존재해야 합니다. 존재하지 않는 동의어 세트를 참조하며 인덱스를 생성하면, 해당 인덱스는 부분적으로만 생성되어 동작하지 않는 상태로 남습니다. 이 상황에서 복구하는 유일한 방법은 동의어 세트가 존재하도록 한 뒤 인덱스를 삭제하고 다시 생성하거나, 인덱스를 닫았다가 다시 여는 것입니다.
Elasticsearch는 분석 과정의 일부로 동의어를 사용합니다. 동의어를 포함하는 데 두 가지 유형의 토큰 필터를 사용할 수 있습니다:
- Synonym graph: 여러 단어로 된 동의어를 올바르게 처리할 수 있어 권장됩니다.
- Synonym: 여러 단어로 된 동의어를 사용해야 한다면 권장되지 않습니다.
구성 세부 사항과 분석기에 추가하는 방법은 각 동의어 토큰 필터 문서를 확인하세요.
동의어 맵을 만들 때 Elasticsearch는 서킷 브레이커로 가용 힙 메모리를 확인해, 많은 수의 동의어 규칙을 처리할 때 동의어 토큰 필터가 out-of-memory 오류를 일으키지 않도록 합니다. 서킷 브레이커는 힙 메모리 사용량이 95%를 넘으면 작동합니다.
임계값은 indices.breaker.total.limit 상위 서킷 브레이커 설정으로 조정할 수 있습니다.
서킷 브레이커가 작동하면 동작은 lenient 매개변수에 따라 결정됩니다:
lenient가true이면 빈 동의어 맵이 사용되고 해당 이벤트가 Elasticsearch 로그에 기록됩니다.lenient가false이면 해당 인덱스가 red 상태가 됩니다.
잘못된 동의어 규칙은 분석기 변경을 적용할 때 오류를 일으킬 수 있습니다. 재로드 가능한 분석기의 경우 재로드와 변경 적용이 막힙니다. 동의어 규칙의 오류를 바로잡고 분석기를 다시 로드해야 합니다.
잘못된 동의어 규칙이 있는 인덱스는 다시 열 수 없으며, 다음 상황에서 동작 불능이 됩니다:
- 해당 인덱스를 포함한 노드가 시작될 때
- 닫힌 상태에서 인덱스를 열 때
- 노드가 재시작될 때(노드에 할당된 샤드가 다시 열림)
인덱스 설정을 변경하지 않고 분석기 구성을 테스트할 수 있습니다. analyze API로 분석기 체인을 테스트하세요:
GET /_analyze
{
"tokenizer": "standard",
"filter" : [
"lowercase",
{
"type": "synonym_graph",
"synonyms": ["pc => personal computer", "computer, pc, laptop"]
}
],
"text" : "Check how PC synonyms work"
}
분석기는 색인 시점 또는 검색 시점에 적용할 수 있습니다.
동의어를 언제 적용할지 결정해야 합니다:
- 색인 시점: 문서가 Elasticsearch에 색인될 때 동의어가 적용됩니다. 동의어를 변경하려면 재색인이 필요하므로 유연성이 떨어지는 방식입니다.
- 검색 시점: 검색이 실행될 때 동의어가 적용됩니다. 재색인이 필요 없어 더 유연한 방식입니다. 토큰 필터가
"updateable": true로 구성되어 있으면, 동의어를 변경할 때 검색 분석기를 다시 로드할 수 있습니다.참고synonyms API나 UI로 생성한 동의어 세트는 검색 시점에만 사용할 수 있습니다.
동의어 세트를 포함하는 분석기는 검색 시점 분석기 또는 색인 시점 분석기로 지정할 수 있습니다.
다음 예시는 인덱스 매핑에서 title 필드의 검색 분석기로 my_analyzer를 추가합니다:
{
"mappings": {
"properties": {
"title": {
"type": "text",
"search_analyzer": "my_analyzer"
}
}
},
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "whitespace",
"filter": [
"synonyms_filter"
]
}
},
"filter": {
"synonyms_filter": {
"type": "synonym",
"synonyms_path": "analysis/synonym-set.txt",
"updateable": true
}
}
}
}
}