Elasticsearch: 텍스트 및 키워드

19746 단어 elasticsearchbeginners

Elasticsearch를 막 배우기 시작한 많은 사람들이 자주 혼동TextKeyword 필드 데이터 형식을 혼동한다.그것들 사이의 차이는 매우 간단하지만 매우 관건적이다.본고에서 나는 양자 간의 차이, 그것들을 어떻게 사용하는지, 그들의 행위 방식, 그리고 어떤 것을 사용하는지 토론할 것이다.

차이점


그것들 사이의 관건적인 차이점은 Elasticsearch는 Text를 역인덱스에 저장하기 전에 분석하지 않고 Keyword 유형을 분석하지 않는다는 것이다.분석하거나 분석하지 않으면 검색할 때의 행동에 영향을 줄 수 있습니다.
만약 네가 Elasticsearch를 막 배우기 시작했지만, 여전히 역방향 색인과 분석기가 무엇인지 모른다면, 나는 네가 먼저 abasic guide to Elasticsearch를 읽는 것을 건의한다.

사용 방법


문자열을 포함하는 문서를 Elasticsearch에 인덱스하고 이전 필드에 정의된 맵이 없으면, Elasticsearch는 데이터 형식 TextKeyword 의 동적 맵을 만들 것입니다.단, 동적 맵과 함께 사용할 수 있어도, 색인을 하기 전에, 공간을 절약하고 쓰기 속도를 높일 수 있도록 용례에 따라 맵 설정을 정의하는 것을 권장합니다.
이것들은 TextKeyword 형식의 맵 설정의 예입니다. 이전에 만든 'text vs keyword' 라는 색인을 사용할 것입니다.
키워드 매핑
curl --request PUT \
  --url http://localhost:9200/text-vs-keyword/_mapping \
  --header 'content-type: application/json' \
  --data '{
 "properties": {
  "keyword_field": {
   "type": "keyword"
  }
 }
}'
텍스트 매핑
curl --request PUT \
  --url http://localhost:9200/text-vs-keyword/_mapping \
  --header 'content-type: application/json' \
  --data '{
 "properties": {
  "text_field": {
   "type": "text"
  }
 }
}'
다영역
curl --request PUT \
  --url http://localhost:9200/text-vs-keyword/_mapping \
  --header 'content-type: application/json' \
  --data '{
 "properties": {
  "text_and_keyword_mapping": {
   "type": "text",
   "fields": {
    "keyword_type": {
     "type":"keyword"
    }
   }
  }
 }
}'

어떻게 일하는지


이 두 필드 유형은 역방향 인덱스에서 다른 인덱스입니다.색인 프로세스의 차이는 Elasticsearch에 대한 질의 시간에 영향을 줍니다.
문서의 색인을 작성합니다. 예를 들면 다음과 같습니다.
curl --request POST \
  --url http://localhost:9200/text-vs-keyword/_doc/example \
  --header 'content-type: application/json' \
  --data '{
 "keyword_field":"The quick brown fox jumps over the lazy dog",
 "text_field":"The quick brown fox jumps over the lazy dog"
}'
curl 명령을 실행한 후 색인에 있는 모든 문서를 가져오면 다음을 수행해야 합니다.
{
    "_index": "text-vs-keyword",
    "_type": "_doc",
    "_id": "example",
    "_score": 1.0,
    "_source": {
        "keyword_field": "The quick brown fox jumps over the lazy dog",
        "text_field": "The quick brown fox jumps over the lazy dog"
    }
}

키워드


간단한 것부터 시작합시다Keyword.Elasticsearch는 데이터 형식을 분석하지 않습니다. 이것은 색인 문자열이 그대로 유지된다는 것을 의미합니다.
그렇다면 위의 예에서 문자열은 역렬 인덱스에서 어떤 모양입니까?

그래, 네 말이 맞다. 이것은 네가 쓴 것과 똑같다.

텍스트

Keyword 필드 데이터 형식과 달리 Elasticsearch에 인덱스된 문자열은 역방향 인덱스에 저장되기 전에 분석기 처리를 거친다.기본적으로 Elasticsearch의 표준 분석기는 색인 문자열을 분리하고 낮춥니다.당신은 Elasticsearch’s documentation에서 표준 분석기에 대한 더 많은 정보를 얻을 수 있습니다.
Elasticsearch에는 분석 프로세스 후 텍스트의 모양을 확인할 수 있는 API가 있습니다.
curl --request POST \
  --url http://localhost:9200/text-vs-keyword/_analyze?pretty \
  --header 'content-type: application/json' \
  --data '{
  "analyzer": "standard",
  "text": "The quick brown fox jumps over the lazy dog"
}'
위의 대답에 의하면 Keyword 필드의 역렬 인덱스는 이렇게 해야 한다

그냥 text_field랑은 좀 다르죠?그러나 검색 과정에 영향을 미치기 때문에 역렬 인덱스에 무엇을 저장하는지 주의해야 합니다.

쿼리 텍스트 및 키워드


현재 우리는 keywordtext가 색인에 있을 때의 행위를 이해했다. 검색될 때의 행동을 알아보자.
우선, 우리는 두 가지 유형의 문자열 조회가 있다는 것을 알아야 한다.
  • 일치 조회
  • 용어 쿼리
  • keywordText와 같이KeywordMatch Query 사이의 차이는 Term Query에서의 조회는 먼저 용어로 분석되고 Match Query에서의 조회는 그렇지 않다는 것이다.
    조회 Elasticsearch의 작업 원리는 조회의 용어를 역렬 색인에 있는 용어와 일치시키는 것입니다. 조회의 용어는 역렬 색인에 있는 용어와 완전히 같아야 합니다. 그렇지 않으면 일치할 수 없습니다.이것은 색인과 검색 결과의 분석 문자열과 분석하지 않은 문자열이 매우 다른 결과를 낳는다는 것을 의미한다.

    용어 쿼리 키워드 필드 사용


    필드 데이터 형식과 조회가 모두 분석을 거치지 않았기 때문에, 그것들은 완전히 같아야만 결과를 생성할 수 있다.
    만약 우리가 완전히 같은 조회를 사용하려고 시도한다면:
    curl --request POST \
      --url 'http://localhost:9200/text-vs-keyword/_doc/_search?size=0' \
      --header 'content-type: application/json' \
      --data '{
     "query": {
      "term": {
       "keyword_field": "The quick brown fox jumps over the lazy dog"
      }
     }
    }'
    
    Elasticsearch가 결과를 반환합니다.
    {
            "_index": "text-vs-keyword",
            "_type": "_doc",
            "_id": "example",
            "_score": 0.2876821,
            "_source": {
              "keyword_field": "The quick brown fox jumps over the lazy dog",
              "text_field": "The quick brown fox jumps over the lazy dog"
            }
          }
    }
    
    만약 우리가 부정확한 것을 시도한다면, 설령 역렬 색인에 이 단어가 있다 하더라도.
    curl --request POST \
      --url 'http://localhost:9200/text-vs-keyword/_doc/_search?size=0' \
      --header 'content-type: application/json' \
      --data '{
     "query": {
      "term": {
       "keyword_field": "The"
      }
     }
    }'
    
    검색의 용어가 역색인의 용어와 일치하지 않기 때문에 결과를 되돌려주지 않습니다.

    일치 조회 쿼리 키워드 필드 사용


    먼저 Term Query부터 Match Query까지 같은 문자열인'빠른 갈색 여우가 게으른 개를 뛰어넘다'를 검색해 보자. 무슨 일이 일어날지 보자.
    curl --request POST \
      --url http://localhost:9200/text-vs-keyword/_doc/_search \
      --header 'content-type: application/json' \
      --data '{
     "query": {
      "match": {
       "keyword_field": "The quick brown fox jumps over the lazy dog"
      }
     }
    }'
    
    결과는 다음과 같습니다.
    {
     "_index": "text-vs-keyword",
     "_type": "_doc",
     "_id": "example",
     "_score": 0.2876821,
     "_source": {
      "keyword_field": "The quick brown fox jumps over the lazy dog",
      "text_field": "The quick brown fox jumps over the lazy dog"
     }
    }
    
    등등, 분석된 검색어에서 나온 용어가 역방향 색인 중의'빠른 갈색 여우가 게으른 개를 뛰어넘는다'와 완전히 일치하지 않기 때문에 그 결과는 왜 나오는 것일까?
    맞아요. 분석 조회를 하는 이유는 keyword_mapping를 사용했기 때문입니다. 그러나 Elasticsearch는 표준 분석기를 사용하지 않고 Match Query 분석기를 사용했습니다. 이 분석기는 index-time 필드 데이터 형식에 비칩니다.Keyword 필드 데이터 형식을 사용하는 분석기가Term analyzer이기 때문에 Elasticsearch는 검색에서 아무런 변경이 없습니다.
    이제 표준 분석기를 사용해 보겠습니다.
    curl --request POST \
      --url http://localhost:9200/text-vs-keyword/_doc/_search \
      --header 'content-type: application/json' \
      --data '{
     "query": {
      "match": {
       "keyword_field": {
        "query": "The quick brown fox jumps over the lazy dog",
        "analyzer":"standard"
       }
      }
     }
    }'
    
    검색어를 용어별로 분석하고 역색인에 있는 용어와 완전히 일치하는 내용이 없기 때문에 결과가 나오지 않습니다.

    용어를 사용하여 질의 텍스트 유형


    텍스트 형식의 인덱스 문서는 이전 절에서 보았던 것처럼 많은 용어를 포함할 것이다.검색이 역렬 색인에 있는 단어와 어떻게 일치하는지 보여주기 위해서, 첫 번째 검색은 전체 문장을 Elasticsearch로 보냅니다.
    curl --request POST \
      --url 'http://localhost:9200/text-vs-keyword/_doc/_search?pretty=' \
      --header 'content-type: application/json' \
      --data '{
     "query": {
      "term": {
       "text_field": "The quick brown fox jumps over the lazy dog"
      }
     }
    }'
    
    두 번째는 "The"밖에 없어요.
    curl --request POST \
      --url 'http://localhost:9200/text-vs-keyword/_doc/_search?pretty=' \
      --header 'content-type: application/json' \
      --data '{
     "query": {
      "term": {
       "text_field": "The"
      }
     }
    }'
    
    이 두 조회는 모두 결과를 내지 못할 것이다.
    첫 번째 검색은 결과가 없습니다. 왜냐하면 역방향 인덱스에서 우리는 전체 문장을 저장하지 않았기 때문입니다. 인덱스 과정은 텍스트에서 블록을 나눈 용어만 저장합니다.
    두 번째 조회도 결과가 없다.색인 문서에 "The"가 있지만, 분석기가 단어의 대소문자를 낮추기 때문에 역렬 색인에는 "The"로 저장된다는 것을 기억하십시오
    "the"를 사용하여 용어 질의를 다시 시도해 보겠습니다.
    curl --request POST \
      --url 'http://localhost:9200/text-vs-keyword/_doc/_search?pretty=' \
      --header 'content-type: application/json' \
      --data '{
     "query": {
      "term": {
       "text_field": "the"
      }
     }
    }'
    
    네!검색의 'the' 가 역렬 인덱스의 'the' 와 완전히 일치하기 때문에 결과가 발생했습니다.

    일치 질의의 텍스트 유형 사용


    지금은 텍스트 유형Keyword을 사용할 때이다. 이 두 가지 유형을 분석했기 때문에 결과를 얻기 쉽다.두 개의 검색어를 먼저 시도해 보도록 하겠습니다.
    첫 번째 검색어는 "The"를 Elasticsearch에 보냅니다. 우리는 사용Match Query하면 결과가 나오지 않을 거라는 것을 알고 있습니다. 하지만term query은요?
    두 번째 검색어에서는 "LAZ dog이 빠른 갈색 개에게 걸려 넘어졌다"는 메시지가 전송됩니다. 어떤 단어는 거꾸로 색인에 있고, 어떤 단어는 거꾸로 색인에 없으며, Elasticsearch는 어떤 결과를 낳을까요?
    curl --request POST \
      --url 'http://localhost:9200/text-vs-keyword/_doc/_search?pretty=' \
      --header 'content-type: application/json' \
      --data '{
     "query": {
      "match": {
       "text_field": "The"
      }
     }
    }'
    
    curl --request POST \
      --url 'http://localhost:9200/text-vs-keyword/_doc/_search?pretty=' \
      --header 'content-type: application/json' \
      --data '{
     "query": {
      "match": {
       "text_field": "the LAZ dog tripped over th QUICK brown dog"
      }
     }
    }'
    
    네!둘 다 결과가 나왔어요.
    {
        "_index": "text-vs-keyword",
        "_type": "_doc",
        "_id": "example",
        "_score": 0.39556286,
        "_source": {
            "keyword_field": "The quick brown fox jumps over the lazy dog",
            "text_field": "The quick brown fox jumps over the lazy dog"
        }
    }
    
    첫 번째 쿼리는 쿼리의'The'가 분석되어'The'로 바뀌었기 때문에 역렬 인덱스의'The'와 완전히 일치합니다.
    두 번째 검색은 모든 용어가 역렬 색인에 있는 것은 아니지만, 결과를 만들어 낸다.Elasticsearch는 검색된 용어 중 역방향 색인에 있는 용어만 완전히 일치하더라도 결과를 되돌려줍니다.
    결과에 주의하면 match query 필드가 나타납니다.검색에서 몇 개의 항목이 역렬 색인 중의 항목과 완전히 일치하는 것은 점수에 영향을 주는 요소 중 하나이지만, 우리는 계산 점수를 다른 날로 남겨 두자.

    둘 중 하나를 사용하는 시기


    다음과 같은 경우 _score 필드 데이터 유형을 사용합니다.
  • 정확한 일치 조회가 필요합니다
  • Elasticsearch를 다른 데이터베이스처럼 실행하고 싶어요
  • 와일드카드 조회에 사용하시겠습니까
  • 다음과 같은 경우 텍스트 필드 데이터 유형을 사용합니다.
  • 자동 완성 만들기
  • 검색 시스템 만들기
  • 결론

    keywordtext 필드 데이터 유형을 이해하는 작업 원리는 Elasticsearch에서 배우고 싶은 내용 중 하나입니다. 차이는 간단할 것 같지만 매우 중요합니다.
    사용자의 용례에 맞는 필드 데이터 형식을 알고 선택해야 합니다. 두 가지 필드 데이터 형식을 원한다면, 맵을 만들 때 여러 필드 기능을 사용할 수 있습니다.
    마지막으로, 나는 본고가 당신이 Elasticsearch를 배우고, Elasticsearch의 텍스트와 키워드 필드 데이터 형식 간의 차이를 이해하는 데 도움을 줄 수 있기를 바랍니다.읽어주셔서 감사합니다!

    좋은 웹페이지 즐겨찾기