반응형
elasticsearch에서 검색기능을 넣다가 2080이라는 키워드를 검색 했을때와 이공팔공이라는 검색어를 입력했을 때 두개 모두 동일한 데이터를 출력하도록 지정하고 싶었다.
그래서 synonyms 필터를 만들기로 했다.
우선 synonyms 필터를 만들어서 사용하기 위해서는 동의어에 대한 정리가 되어있는 사전을 만들어야 한다.
사전 생성 방법은 다음과 같고 아래 링크를 참조해서 간단하게 사전을 만들었다.
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-synonym-tokenfilter.html
파일명은 synonyms.txt이고 내용은 다음과 같다.
synonyms.txt
노레바,noreva,노래바
airpods,에어팟,airpod,airpot
2080,이공팔공
동의어 정리 사전을 elasticsearch에 넣어줘야하고 경로는 다음과 같다.
/usr/share/elasticsearch/config/analysis
나는 docker를 사용하기 때문에 생성한 파일을 다음 명령어를 통해 위치시켰다.
docker cp synonyms.txt elastic6.4:/usr/share/elasticsearch/config/analysis
그럼 이 필터를 사용하기 위해서 인덱스를 만들 때 설정을 달아서 추가해주자.
간단하게 keyword 하나만 존재하는 인덱스를 만들고 synonyms filter를 사용하게 해보자
여기서 사용하 tokenizer는 nori_tokenizer를 사용했다.
간단한 예제니 보면 바로 이해할 수 있다.
PUT synonyms_test
{
"settings": {
"index" : {
"analysis" : {
"analyzer" : {
"synonym" : {
"tokenizer" : "nori_tokenizer",
"filter" : ["synonym"]
}
},
"filter" : {
"synonym" : {
"type" : "synonym",
"synonyms_path" : "analysis/synonyms.txt"
}
}
}
}
},
"mappings": {
"_doc": {
"dynamic": "false",
"properties": {
"keyword": {
"type": "text",
"analyzer": "synonym",
"search_analyzer": "synonym",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
}
데이터를 2080과 이공팔공 두개를 삽입했다.
POST synonyms_test/_doc
{
"keyword":"2080"
}
POST synonyms_test/_doc
{
"keyword":"이공팔공"
}
그럼 이 두개의 키워드가 동일하게 하나의 명령어로 검색이 되는지 확인해보자.
GET synonyms_test/_search
{
"query": {
"match": {
"keyword": "이공팔공"
}
}
}
반응형
'데이터베이스 > Elasticsearch' 카테고리의 다른 글
Elasticsearch template를 일별 index 구성하기 (0) | 2019.06.12 |
---|---|
Elasticsearch에서 reindex를 이용해서 매핑정보 변경하기 (0) | 2019.06.12 |
elasticsearch 7.0 docker 설치 후 변경사항 확인 (0) | 2019.04.12 |
docker logstash 설치 및 log 파일 elasticsearch에 기록 (1) | 2019.01.23 |
Elasticsearch에서 refresh 정리 (0) | 2018.11.18 |