[ELK] suggestion API completion field analyzer

홍종훈·2025년 1월 17일

ELK

목록 보기
6/6
post-thumbnail

1. 문제상황


자동완성 API에서 숫자가 들어가면 검색이 안된다는 문의가 들어왔다.

2. 원인 파악

1. Index setting 파악

          "SUGGEST": {
            "search_analyzer": "jamo",
            "max_input_length": 100,
            "contexts": [
              {
                "name": "ENTR_ID",
                "type": "CATEGORY"
              }
            ],
            "type": "completion"
          },

한글 검색은 잘 되지만, 숫자만 들어가면 검색이 되지 않으니 analyzer를 확인해봤다.
completion 필드엔 analyzer, search_analyzer 두 가지가 설정될 수 있는데, search_analyzer만 설정되어 있는 상태였다.

2. 공식 문서 확인

Elasticsearch공식문서에서 completion필드에 들어가는 파라미터들을 확인해봤다.
analyzer에 default값으로 simple analyzer가 사용된다고 적혀있었다.

2-1. simple analyzer

  • ES 공식문서:
    https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-simple-analyzer.html
    simple analyzerlowercase tokenizer를 사용하는 analyzer이다.

    lowercase tokenizerletter tokenizer와 마찬가지로 문자가 아닌 문자를 만날 때마다 텍스트를 용어로 분리하지만, 모든 용어를 소문자로 변환하기도 한다. 이는 letter tokenizerlowercase token filter를 결합한 것과 기능적으로 동일하지만, 두 단계를 한 번에 수행하기 때문에 더 효율적입니다.

    simple analyzer는 숫자, 공백, 하이픈, 아포스트로피와 같은 문자 이외의 문자가 나타날 때마다 텍스트를 토큰으로 분리하고, 문자 이외의 문자를 제거하며, 대문자를 소문자로 변환한다.
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_simple_analyzer": {
          "tokenizer": "lowercase",
          "filter": [                          
          ]
        }
      }
    }
  }
}

3. 원인 파악 완료

completion 필드에 들어가는 default analyzer로 simple analyzer가 들어가기 때문에 발생했던 문제였다.
simple analyzer 를 index analyzer로 사용하기 때문에 색인 과정에서 숫자가 사라져서 색인되고 있었고,
따라서 숫자로 검색할 경우 검색결과가 나오지 않았던 것이다.

3. 해결방법

우선적으로 대응한 것은 analyzer 부분에 standard analyzer를 설정해주는 것이었다. standard analyzer의 경우 적어도 숫자나 문자 등 검색에 필요한 요소들은 제거하지 않기 때문에 적용해도 큰 문제가 없을 것 같았다.

하지만, 현재 색인할 때 ingest를 사용하여 자동완성에 필요한 결과들을 input에 넣은 뒤 색인을 하고 있으므로 아무런 analyzer 적용 없이 색인되길 바랬다.

1. standard analyzer

  • ES공식문서 : https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-standard-analyzer.html
    standard analyzerstandard tokenizer를 사용하며, lowercase 필터를 사용하는 analyzer이다.

    standard tokenizer는 Unicode Text Segmentation algorithm을 기반으로 단어를 분리 시킨다. 공식 홈페이지에 따르면 가장 무난한 옵션이다.

    하지만 standard analyzer는 특정 언어에 최적화되어 있지 않기 때문에, 특정 언어의 특성을 고려한 분석기가 필요한 경우에는 해당 언어 전용 분석기를 사용하는 것이 더 효과적일 수 있다.

    PUT /standard_example
    {
     "settings": {
       "analysis": {
         "analyzer": {
           "rebuilt_standard": {
             "tokenizer": "standard",
             "filter": [
               "lowercase"       
             ]
           }
         }
       }
     }
    }
profile
Search Engineer

0개의 댓글