안녕하세요.
Elasticsearch 사람 이름 검색을 wildcard로 구현을 했었는데,
wildcard 쿼리가 속도가 많이 느려 사용을 지향한다는 소식을 듣고
N-gram을 사용을 하여 구현을 한것을 공유하겠습니다.
PUT human
{
"settings": {
"index" : {
"max_ngram_diff": 12
},
"analysis": {
"analyzer": {
"ngram_analyzer": {
"tokenizer": "ngram_tokenizer"
}
},
"tokenizer": {
"ngram_tokenizer": {
"token_chars": [
"letter",
"digit"
],
"min_gram": "1",
"type": "ngram",
"max_gram": "12"
}
}
}
},
"mappings": {
"properties": {
"name": {
"type": "text",
"fields": {
"ngram": {
"type": "text",
"analyzer": "ngram_analyzer",
"search_analyzer": "keyword"
},
"keyword" : {
"type" : "keyword"
}
}
}
}
}
}
index 생성문에 name 매핑을 보면 한가지 특이한점이 있습니다.
바로 search_analyzer를 Keyword로 설정을 한 것인데요.
이유는 인물 이름이 홍길동, 김지홍이 색인이 되었다고 가정을 하면
홍길동 으로 검색을 할시 토큰이 "홍 홍길 홍길동 길 길동 동" 이와같이 분리되어서 검색쿼리가 수행이되어서
김지홍이라는 사람도 검색이 되는 이슈가 있습니다.
그래서 search_analyzer를 keyword로 설정을 하여 검색에서는 원문 철자 그대로 수행이되게 적용을 하여 사용을 했습니다.
'Elasticsearch(엘라스틱서치)' 카테고리의 다른 글
[elasticsearch] circuit_breaking_exception 에러 처리 (0) | 2022.10.25 |
---|---|
[Elasticsearch] Linux에 설치시 설정값 정리 (0) | 2021.08.18 |
[Elasticsearch] 엘라스틱서치 한글 형태소 분석기 노리(nori) 설치하기 (0) | 2020.11.30 |
[Elasticsearch, Kibana] 엘라스틱 서치, 키바나 로컬 환경에 구축하기 (0) | 2020.11.30 |