Elasticsearch 인덱스의 매핑 구성 상세 정보

14600 단어

개요


Elasticsearch와 전통적인 SQL 데이터베이스의 뚜렷한 차이점은 Elasticsearch는 비구조화된 데이터베이스이거나 패턴이 없는 데이터베이스라는 것이다.Elasticsearch에서 데이터의 가장 중요한 세 가지 요소는 바로 색인, 유형, 문서이다. 그 중에서 색인이라는 개념은 매우 중요하다. 우리는 이를 전통적인 SQL 데이터베이스에 있는 데이터 표에 대충 비교할 수 있다.이 문서는 Elasticsearch의 색인 매핑을 어떻게 설정하는지부터 시작합니다.
주: 본고는 My Personal Blog에서 시작되었습니다. 작은 역에 오신 것을 환영합니다!
본고의 내용 뇌도는 다음과 같다. 문장은 모두 1540자이고 본문을 읽는 데 약 5분이 걸린다!

색인 모드 매핑


색인을 만들 때 사용자 정보 데이터를 저장하는 users 색인을 만드는 것과 같은 색인 구조를 사용자 정의할 수 있습니다. 전형적인 구조는 다음과 같습니다.
  • id: 고유 표현자
  • name: 이름
  • birthday: 생년월일
  • hobby: 취미
  • 이를 위해 json 형식의 색인 모드 맵 파일을 만들 수 있습니다:users.json
    {
    	"mappings" : {
    		"user" : {
    			"properties" : {
    				"id" : {
    					"type" : "long",
    					"store" : "yes"
    				},
    				"name" : {
    					"type" : "string",
    					"store" : "yes",
    					"index" : "analyzed"
    				},
    				"birthday" : {
    					"type" : "date",
    					"store" : "yes"
    				},
    				"hobby" : {
    					"type" : "string",
    					"store" : "no",
    					"index" : "analyzed"
    				}
    				
    			}
    		}
    	}
    }
    

    위의 json 코드의 의미는 다음과 같습니다.
  • Indexusers라는 이름을 만듭니다.
  • 에는 user 라는 Type
  • 이 있습니다.
  • 그리고 user 4개의field
  • 그리고field마다 자신의 속성 정의가 있다
  • 그리고 다음 명령을 실행하여 색인을 새로 만듭니다.
    curl -X PUT http://47.98.43.236:9200/users -d @users.json
    

    결과는 다음과 같습니다. 인덱스users, 유형user, 그리고 네 필드가 모두 순조롭게 삽입되었습니다.
    필드의 선택 가능한 유형은 다음과 같습니다.
  • string: 문자열
  • number: 숫자
  • date: 날짜
  • boolean: 부울
  • binary: 바이너리
  • ip: IP 주소
  • token_count유형
  • 각 유형에 어떤 속성이 있는지 공식 문서를 참고할 수 있습니다. 내용이 너무 많기 때문에 여기에서 더 이상 군더더기를 하지 않습니다.

    분석기 사용


    분석기는 데이터를 분석하거나 사용자가 원하는 방식으로 처리하는 도구로 문자열 형식의 필드에 대해 Elasticsearch는 사용자 정의 분석기를 허용합니다.
  • 먼저 분석기 사용자 정의
  • {
      "settings" : {
        "index" : {
          "analysis" : {
            "analyzer" : {
              "myanalyzer" : {
                "tokenizer" : "standard",
                "filter" : [
                  "asciifolding",
                  "lowercase",
                  "myFilter"
                ]
              }
            },
            "filter" : {
              "myFilter" : {
                "type" : "kstem"
              }
            }
          }
    
        }
      },
    	"mappings" : {
    		"user" : {
    			"properties" : {
    				"id" : {
    					"type" : "long",
    					"store" : "yes"
    				},
    				"name" : {
    					"type" : "string",
    					"store" : "yes",
    					"index" : "analyzed",
                        "analyzer" : "myanalyzer"
    				},
    				"birthday" : {
    					"type" : "date",
    					"store" : "yes"
    				},
    				"hobby" : {
    					"type" : "string",
    					"store" : "no",
    					"index" : "analyzed"
    				}
    
    			}
    		}
    	}
    }
    

    상기 json 코드에서 사용자는 myanalyzer라는 분석기를 정의했다. 이 분석기는 분사기 + 세 개의 필터를 포함하는데 각각 다음과 같다.
  • 분사기: standard
  • 필터: asciifolding
  • 필터: lowercase
  • 필터: myFilter(사용자 정의 필터, 본질은 kstem
  • 사용자 정의 분석기 테스트 및 사용 방법
  • 다음과 같은 Restful 인터페이스를 통해 analyze API 작업을 테스트할 수 있습니다.
    curl -X GET 'http://47.98.43.236:9200/users/_analyze?field=user.name' -d 'Cars Trains'
    

    우리가 입력했을 때 한 줄의 문자열은 보통"Cars Trains"이고 출력은 cartrain이다. 이것은 단어"Cars Trains"가 두 개의 단어로 나누어진 다음에 모두 소문자로 바뀌고 마지막에 어간 추출 작업을 한 것을 나타낸다. 이로써 우리가 위에서 정의한 분석기가 이미 효력이 발생했다는 것을 증명한다.

    유사도 모델의 설정


    Elasticsearch는 색인 모드 맵 파일의 서로 다른 필드에 서로 다른 유사도 득점 계산 모델을 지정할 수 있습니다. 그 용례는 다음과 같습니다.
    	"mappings" : {
    		"user" : {
    			"properties" : {
    				"id" : {
    					"type" : "long",
    					"store" : "yes"
    				},
    				"name" : {
    					"type" : "string",
    					"store" : "yes",
    					"index" : "analyzed",
                        "analyzer" : "myanalyzer",
                        "similarity" : "BM25"
    				},
    				"birthday" : {
    					"type" : "date",
    					"store" : "yes"
    				},
    				"hobby" : {
    					"type" : "string",
    					"store" : "no",
    					"index" : "analyzed"
    				}
    
    			}
    		}
    	}
    

    상기 json 파일에서 우리는 name 필드에 BM25라는 유사도 모델을 사용했습니다. 추가된 방법은 similarity 속성의 키 값을 사용하는 것입니다. 그러면 Elasticsearch는 name 필드에 BM25 유사도 계산 모델을 사용하여 유사 득점을 계산할 것입니다.

    정보 형식 구성


    Elasticsearch는 필드가 인덱스되는 방식을 바꾸어 성능을 향상시키는 조건을 충족시키기 위해 모든 필드에 정보 형식을 지정합니다.Elasticsearch의 정보 형식은 다음과 같습니다.
  • default: 기본 정보 형식, 저장 필드와 단어 벡터에 대한 실시간 압축 제공
  • pulsing: 중복된 값이 적은 필드의 정보 목록을 단어 행렬로 인코딩하여 이 필드의 조회 속도를 높일 수 있음
  • direct: 이 형식은 읽는 과정에서 단어를 압축되지 않고 메모리가 존재하는 행렬에 불러옵니다. 이 형식은 상용 필드의 성능을 향상시킬 수 있으나 메모리 손실
  • memory: 이 형식은 모든 데이터를 디스크에 쓰고 FST로 단어와 정보 목록을 메모리에 읽어야 합니다
  • bloom_default: 기본 정보 형식의 확장으로 bloom filter 디스크에 쓰는 기능이 추가되었습니다.읽을 때 bloom filter 읽히고 메모리에 저장되어 주어진 값이 존재하는지 신속하게 확인할 수 있습니다
  • bloom_pulsing: pulsing 형식의 확장, bloom filter 지원
  • 정보 형식 필드 postings_format 는 다음 예와 같이 모든 필드에서 설정할 수 있습니다.
    	"mappings" : {
    		"user" : {
    			"properties" : {
    				"id" : {
    					"type" : "long",
    					"store" : "yes",
                        "postings_format" : "pulsing"
    				},
    				"name" : {
    					"type" : "string",
    					"store" : "yes",
    					"index" : "analyzed",
                        "analyzer" : "myanalyzer"
    				},
    				"birthday" : {
    					"type" : "date",
    					"store" : "yes"
    				},
    				"hobby" : {
    					"type" : "string",
    					"store" : "no",
    					"index" : "analyzed"
    				}
    
    			}
    		}
    	} 
    

    이 예에서 우리는 수동으로 id 필드의 정보 형식을 pulsing 로 바꾸었기 때문에 이 필드의 조회 속도를 높일 수 있다.

    문서 값 및 형식 구성


    문서 값이라는 필드 속성은 주어진 필드의 값을 더욱 효율적인 정렬과 검색을 위해 메모리 효율이 높은 구조에 쓸 수 있도록 하는 데 작용한다.우리는 보통 이 속성을 정렬해야 하는 필드에 추가할 수 있으며, 이렇게 하면 효과를 볼 수 있다.
    그 구성 방식은 속성doc_values_format을 통해 진행되는데 세 가지 자주 사용하는 doc_values_format 속성 값이 있는데 그 의미는 이름에서도 대략적으로 알 수 있다.
  • default: 기본 형식이며 적은 메모리를 사용하지만 성능도 좋습니다
  • disk: 메모리가 거의 필요 없는 디스크에 데이터 저장
  • memory: 메모리에 데이터 저장
  • 밤을 들어라.
    	"mappings" : {
    		"user" : {
    			"properties" : {
    				"id" : {
    					"type" : "long",
    					"store" : "yes"
    				},
    				"name" : {
    					"type" : "string",
    					"store" : "yes",
    					"index" : "analyzed",
              "analyzer" : "myanalyzer"
    				},
    				"birthday" : {
    					"type" : "date",
    					"store" : "yes"
    				},
    				"hobby" : {
    					"type" : "string",
    					"store" : "no",
    					"index" : "analyzed"
    				},
                    "age" : {
                        "type" : "integer",
                        "doc_values_format" : "memory"
                     }
    			}
    		}
    	}
    

    상기 json 설정에서 우리는 유형userage 필드를 추가했습니다. 만약에 우리가 나이 필드를 정렬하고 싶다면 이 필드에 문서 값 형식의 속성을 설정하면 효율을 높일 수 있습니다.

    후기


    능력에 한계가 있기 때문에 만약에 잘못되거나 부당한 점이 있으면 모두가 비판하고 바로잡으며 함께 교류하는 것을 배워야 합니다!
  • My Personal Blog
  • 저자의 더 많은 오리지널 글, 감상 환영
  • 내 반년 기술 블로그의 길
  • 아래의 조심스러움을 길게 누르거나 스캔하여 CodeSheep에 가입하여 더 많은 실용적이고 알아볼 수 있으며 재현할 수 있는 오리지널 문장을 얻을 수 있습니다↓↓↓

    좋은 웹페이지 즐겨찾기