집합 작업 오류: 기본적으로 텍스트 필드에서 Fielddata를 비활성화합니다.Set fielddata=true

14119 단어

환경


elasticsearch:5.4.3 가상 머신:centos7 kibana:5.4.3 운영체제:win7

개요


이 편 은 개인 학습 노트 에 속하며, 튜토리얼 을 하지 않는다

색인


데이터를 elasticsearch 에 저장하는 행위를 라고 한다.
색인이라는 단어가 Elasticsearch 언어 환경에 얼마나 많은 의미를 포함하는지 알아차렸을 수도 있으므로 다음과 같은 설명을 할 필요가 있다.
색인(명사):
앞에서 말한 바와 같이 색인은 전통적인 관계 데이터베이스 중의 데이터베이스와 유사하고 관계형 문서를 저장하는 곳이다.인덱스 (index) 의 복수어는 인덱스 또는 인덱스입니다.
색인 (동사):
색인 문서는 검색하고 조회할 수 있도록 색인 (명사) 에 문서를 저장하는 것입니다.이것은 SQL 문장의 INSERT 키워드와 매우 유사합니다. 문서가 이미 존재할 때 새 문서가 이전 문서를 대체하는 경우를 제외하고는.
역렬 인덱스:
관계형 데이터베이스는 데이터 검색 속도를 높이기 위해 B 트리(B-tree)와 같은 색인을 지정한 열에 추가합니다.Elasticsearch와 Lucene는 같은 목적을 달성하기 위해 역렬 인덱스라는 구조를 사용했다.+ 기본적으로 문서의 모든 속성은 인덱스 (역렬 인덱스) 와 검색 가능합니다.역렬 인덱스가 없는 속성은 검색할 수 없습니다.우리는 역렬 인덱스에서 역렬 인덱스의 더 많은 세부 사항을 토론할 것이다.

구문 검색


단어 검색은 정확하게 일치하는 것이다.
GET megacorp/employee/_search
{
  "query": {
    "match_phrase": {
      "about": "rock climbing"
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

  • 여기에는 match_phrase 필터를 사용하여 정확하게 일치하는 필드 aboutrock climbing 인 문서가 있습니다.

    fielddata


    이것fielddata은 홈페이지Mapping 장절에 있습니다.번역:
    기본적으로 대부분의 필드는 검색할 수 있도록 인덱스되어 있습니다.그러나 스크립트에서 정렬, 집합, 접근 필드의 값은 서로 다른 검색 접근 패턴이 필요합니다.
    검색에 필요한 질문은 “ ?”, 정렬과 집합에 필요한 질문은 “ ?”대부분의 필드는 index-time, 디스크의 doc_values를 사용하여 이 데이터의 접근 모드에 사용할 수 있다.그러나 text 필드는 지원되지 않습니다doc_values.
    대체적으로 text 필드는 fielddata라는 데이터 구조를 사용하는데 이 데이터 구조는 조회할 때 메모리 데이터 구조를 의미한다.이 데이터 구조는 집합, 정렬, 스크립트에 사용되는 필드에 수요에 따라 처음으로 구축된 것이다.디스크의 각 세그먼트에서 전체 역렬 인덱스를 읽어서 구축된 역렬 관계는 jvm 더미에 저장된 메모리에 저장된다.

    text 필드는 기본적으로 열려 있지 않습니다.

    fielddata는 대량의 공간을 소모하는데, 특히 높은 기수text 필드를 불러올 때.일단 fielddata 더미에 싣게 되면, 그것은 단락의 생명 주기 안에 유지될 것이다.그 밖에 로드 fielddata 는 비싼 과정으로 사용자가 지연 명중을 겪게 할 수 있다.이것이 바로 묵인이 금지된 이유다.text 필드에서 정렬, 집합, 스크립트에서 접근 값을 시도하면 이 이상을 볼 수 있습니다.
    Fielddata is disabled on text fields by default. Set fielddata=true on [your_field_name] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory.

    fielddata를 사용하기 전에

    fielddata를 시작하기 전에 text 필드를 집합, 정렬, 스크립트에 왜 사용하는지 생각해 보세요.이렇게 해서 통과하는 것은 무의미하다.
    색인을 하기 전에 텍스트 필드를 분석하여 검색 new 이나 york 을 통해 검색 new york 할 수 있도록 해야 합니다.new york값 (통) 을 원할 때, 이 필드의 집합 작업 termsnew 값 (통:bucket) 과 york 값 (통:bucket) 을 되돌려줍니다.
    설명: bucketelasticsearch 집합 작업을 수행하여 반환한 결과 값입니다.사실은 수조야.예:
    GET megacorp/employee/_search
    {
      "aggs": {
        "all_int": {
          "terms": {"field": "interests"},//terms
          "aggs": {
            "avg_age": {
              "avg": {
                "field": "age"
              }
            }
          }
        }
      }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

  • 효과는 다음과 같습니다.
    "aggregations": {
        "all_int": {
          "doc_count_error_upper_bound": 0,
          "sum_other_doc_count": 0,
          "buckets": [//buckets
            {
              "key": "music",
              "doc_count": 2,
              "avg_age": {
                "value": 28.5
              }
            },
            {
              "key": "forestry",
              "doc_count": 1,
              "avg_age": {
                "value": 35
              }
            },
            {
              "key": "sports",
              "doc_count": 1,
              "avg_age": {
                "value": 25
              }
            }
          ]
        }
      }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

  • 반대로 전체 텍스트 검색에 사용할 텍스트 필드와 분석되지 않은 키워드 필드 doc_values 를 사용해야 합니다.다음과 같습니다.
    PUT my_index
    {
      "mappings": {
        "my_type": {
          "properties": {
            "my_field": { ①
              "type": "text",
              "fields": {
                "keyword": { ②
                  "type": "keyword"
                }
              }
            }
          }
        }
      }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

  • ①: my_field 필드를 사용하여 검색합니다.②: 집합, 정렬 및 스크립트에서 사용할 필드my_field.keyword를 사용합니다.

    텍스트 필드에fielddata 사용하기


    다음과 같이 기존 text 필드에서 PUT mapping API 활성화 fielddata 를 사용할 수 있습니다.
    PUT my_index/_mapping/my_type
    {
      "properties": {
        "my_field": { ①
          "type":     "text",
          "fielddata": true
        }
      }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

  • ①: 당신이 지정한 맵은 기존의 필드맵과 my_field 매개 변수로 구성되어야 합니다.
    참고:fielddata 매개 변수 설정은 같은 색인에서 같은 필드 이름을 일치시켜야 합니다.그는 fielddata.* 을 사용하여 기존 값을 업데이트할 수 있다.
    홈페이지 튜토리얼에서 오픈PUT mapping API 방법:
    이 코드의 목적은 검색할 수 있을 뿐만 아니라 집합할 수 있도록 하기 위해서이다.
    PUT megacorp/_mapping/employee
    {
      "properties": {
        "interests":{
          "type": "text",
          "fields": {
            "keyword":{
              "type": "keyword"
            }
          }
        }
      }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

  • 켜기fielddata:
    PUT megacorp/_mapping/employee
    {
      "properties": {
        "interests":{
          "type": "text",
          "fielddata": true
        }
      }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

  • PUT와 POST의 차이점


    여기에는 단지 작은 차이점을 말할 뿐이다.
    문서를 삽입할 때 지정fielddata이 없으면 해당 _id 가 자동으로 생성됩니다 elasticsearch.
    POST website/blog
    {
      "title": "My third blog entry",
      "text": "Third still trying this out...",
      "date": "2017/07/05"
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

  • 결과:
    {
      "_index": "website",
      "_type": "blog",
      "_id": "AV0Qv0wO-S86jJ72I7lo",// id 
      "_version": 1,
      "result": "created",
      "_shards": {
        "total": 2,
        "successful": 2,
        "failed": 0
      },
      "created": true
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • post를 사용하고 지정되지 않은 경우put:
    PUT website/blog
    {
      "title": "My third blog entry",
      "text": "Third still trying this out...",
      "date": "2017/07/05"
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

  • 오류 보고:
    No handler found for uri [/website/blog] and method [PUT]

    좋은 웹페이지 즐겨찾기