Elasticsearch 인덱스의 매핑 구성 상세 정보
개요
Elasticsearch와 전통적인 SQL 데이터베이스의 뚜렷한 차이점은 Elasticsearch는 비구조화된 데이터베이스이거나 패턴이 없는 데이터베이스라는 것이다.Elasticsearch에서 데이터의 가장 중요한 세 가지 요소는 바로 색인, 유형, 문서이다. 그 중에서 색인이라는 개념은 매우 중요하다. 우리는 이를 전통적인 SQL 데이터베이스에 있는 데이터 표에 대충 비교할 수 있다.이 문서는 Elasticsearch의 색인 매핑을 어떻게 설정하는지부터 시작합니다.
주: 본고는 My Personal Blog에서 시작되었습니다. 작은 역에 오신 것을 환영합니다!
본고의 내용 뇌도는 다음과 같다. 문장은 모두 1540자이고 본문을 읽는 데 약 5분이 걸린다!
색인 모드 매핑
색인을 만들 때 사용자 정보 데이터를 저장하는
users
색인을 만드는 것과 같은 색인 구조를 사용자 정의할 수 있습니다. 전형적인 구조는 다음과 같습니다.id
: 고유 표현자name
: 이름birthday
: 생년월일hobby
: 취미{
"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 코드의 의미는 다음과 같습니다.
users
라는 이름을 만듭니다.user
라는 Type user
4개의fieldcurl -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
curl -X GET 'http://47.98.43.236:9200/users/_analyze?field=user.name' -d 'Cars Trains'
우리가 입력했을 때 한 줄의 문자열은 보통
"Cars Trains"
이고 출력은 car
과 train
이다. 이것은 단어"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 설정에서 우리는 유형
user
에 age
필드를 추가했습니다. 만약에 우리가 나이 필드를 정렬하고 싶다면 이 필드에 문서 값 형식의 속성을 설정하면 효율을 높일 수 있습니다.후기
능력에 한계가 있기 때문에 만약에 잘못되거나 부당한 점이 있으면 모두가 비판하고 바로잡으며 함께 교류하는 것을 배워야 합니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.