Elasticsearch의 문서 분석



Elasticsearch에서 문서를 인덱싱할 때 해당 텍스트 값은 분석 프로세스를 거칩니다. 이 기사에서는 이 프로세스에서 일어나는 일과 Elasticsearch의 표준 분석기가 작동하는 방식을 다룰 것입니다.

분석 소개



분석의 주요 목적은 문서를 검색에 효율적으로 만드는 방식으로 문서를 저장하는 것입니다. 이는 Elasticsearch에서 일부 문서를 인덱싱하는 순간에 발생하며 이를 위해 다음과 같은 세 가지 메커니즘을 사용합니다.
  • 문자 필터
  • 토크나이저
  • 토큰 필터


  • 문자 필터



    첫 번째 단계는 전체 텍스트를 수신하고 문자를 추가, 제거 또는 변경하는 것입니다. 예를 들어 다음과 같은 HTML 태그를 제거할 수 있습니다.

    입력: <p>I <strong>REALLY</strong> love to go hiking!</p>결과: I REALLY love to go hiking!
    분석기는 0개 이상의 문자 필터를 포함할 수 있으며 작업 결과는 토크나이저로 전달됩니다.

    토크나이저



    문자 필터와 달리 분석기는 정확히 하나의 토크나이저를 포함해야 하며 그 책임은 문자열을 토큰으로 분할하는 것입니다. 이 과정에서 구두점과 같은 일부 문자가 텍스트에서 제거될 수 있습니다. 이에 대한 예는 다음과 같습니다.

    입력: I REALLY love to go hiking!결과: "I", "REALLY", "love", "to", "go", "hiking"

    토큰 필터



    토큰 필터는 토큰을 수신하고 작동합니다. 간단한 예는 소문자 필터입니다.
    입력: "I", "REALLY", "love", "to", "go", "hiking"결과: "i", "really", "love", "to", "go", "hiking"
    분석기에는 0개 이상의 토큰 필터가 있을 수도 있습니다.

    내장 문자 필터, 토크나이저 및 토큰 필터의 더 많은 예를 보려면 official documentation 을 확인할 수 있습니다.

    Elasticsearch의 표준 분석기는 다음으로 구성됩니다.
  • 문자 필터 없음
  • standard tokenizer
  • 소문자 및 선택적 불용어 토큰 필터입니다.

  • 분석 API 사용



    Elasticsearch는 분석 API인 문자열이 분석되는 방식을 시각화하는 방법을 제공합니다. 이를 사용하려면 POST 매개변수를 사용하여 /_analyze 끝점에 "text" 요청을 보내면 됩니다. 그것을 밖으로 시도하자!

    POST /_analyze
    {
      "text": "The 2 QUICK     Brown-Foxes jumped over the lazy dog's bone. :)"
    }
    


    응답에서 생성된 토큰을 볼 수 있습니다.

    {
      "tokens" : [
        {
          "token" : "the",
          "start_offset" : 0,
          "end_offset" : 3,
          "type" : "<ALPHANUM>",
          "position" : 0
        },
        {
          "token" : "2",
          "start_offset" : 4,
          "end_offset" : 5,
          "type" : "<NUM>",
          "position" : 1
        },
        {
          "token" : "quick",
          "start_offset" : 6,
          "end_offset" : 11,
          "type" : "<ALPHANUM>",
          "position" : 2
        },
        {
          "token" : "brown",
          "start_offset" : 12,
          "end_offset" : 17,
          "type" : "<ALPHANUM>",
          "position" : 3
        },
        {
          "token" : "foxes",
          "start_offset" : 18,
          "end_offset" : 23,
          "type" : "<ALPHANUM>",
          "position" : 4
        },
        {
          "token" : "jumped",
          "start_offset" : 24,
          "end_offset" : 30,
          "type" : "<ALPHANUM>",
          "position" : 5
        },
        {
          "token" : "over",
          "start_offset" : 31,
          "end_offset" : 35,
          "type" : "<ALPHANUM>",
          "position" : 6
        },
        {
          "token" : "the",
          "start_offset" : 36,
          "end_offset" : 39,
          "type" : "<ALPHANUM>",
          "position" : 7
        },
        {
          "token" : "lazy",
          "start_offset" : 40,
          "end_offset" : 44,
          "type" : "<ALPHANUM>",
          "position" : 8
        },
        {
          "token" : "dog's",
          "start_offset" : 45,
          "end_offset" : 50,
          "type" : "<ALPHANUM>",
          "position" : 9
        },
        {
          "token" : "bone",
          "start_offset" : 51,
          "end_offset" : 55,
          "type" : "<ALPHANUM>",
          "position" : 10
        }
      ]
    }
    


    이 API에서 사용할 문자 필터, 토크나이저 및 토큰 필터를 지정할 수 있습니다. 다음과 같이 요청했다면 동일한 결과가 반환되었을 것입니다.

    POST /_analyze
    {
      "text": "The 2 QUICK     Brown-Foxes jumped over the lazy dog's bone. :)",
      "char_filter": [],
      "tokenizer": "standard",
      "filter": ["lowercase"]
    }
    

    좋은 웹페이지 즐겨찾기