Elasticsearch(엘라스틱서치)

[Elasticsearch] N-gram을 사용하여 인물 이름 검색 구현

yong_zz 2021. 6. 21. 14:43

안녕하세요.

 

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로 설정을 하여 검색에서는 원문 철자 그대로 수행이되게 적용을 하여 사용을 했습니다.