'Elasticsearch'에 해당되는 글 43건

03. Index APIs - 03 :: 2015/05/19 09:04

Automatic ID Generation


Index operation 특정 id 지정 없이 실행될 있다. 그런 경우에는 id 자동으로 생성된다. 게다가 op_type 자동으로 create 설정될 것이다. 여기에 예제가 있다. (PUT 대신에 POST 사용되었음에 유의하라.)


$ curl -XPOST 'http://localhost:9200/twitter/tweet/' -d '{
  
"user" : "kimchy",
  
"post_date" : "2009-11-15T14:12:12",
  
"message" : "trying out Elasticsearch"
}'


위의 index operation 대한 결과는 다음과 같다.


{
  
"_index" : "twitter",
  
"_type" : "tweet",
  
"_id" : "6a8ca01c-7896-48e9-81cc-9f70661fcb32",
  
"_version" : 1,
  
"created" : true
}


Routing


기본적으로 shard 위치 - 혹은 routing - document id 값을 hash하여 제어된다. 명시적인 제어를 위해서 router 사용된 hash function 반영된 값은 routing parameter 사용한 per-operation 기반으로 직접 사용할 있다. 예를 들면 다음과 같다.


$ curl -XPOST 'http://localhost:9200/twitter/tweet?routing=kimchy' -d '{
  
"user" : "kimchy",
  
"post_date" : "2009-11-15T14:12:12",
  
"message" : "trying out Elasticsearch"
}'


위의 예제에서 "tweet" document 제공된 "kimchy" routing parameter 기반하여 해당 shard route된다.

명시적으로 mapping 설정하면, _routing 필드를 document에서 routing value 추출하여 index operation 직접 사용할 있다. 이것은 추가적인 document parse측면에서 최소한의 비용으로 처리할 있다. 만약 _routing mapping 정의되고, required 설정되었을 경우, routing value 제공되지 않거나 추출한 값이 없으면 index operation 실패할 것이다.


Parents & Children


Child document indexing parent 명시하여 index 있다. 예를 들면 다음과 같다.


$ curl -XPUT localhost:9200/blogs/blog_tag/1122?parent=1111 -d '{
  
"tag" : "something"
}'


Child document indexing , routing value routing parameter 명시적으로 지정되지 않으면, 자동으로 parent 동일하게 설정된다.


Timestamp


Document 그와 관련된 timestamp index 있다. Document timestamp 값은 timestamp parameter 사용해서 설정할 있다. 예를 들면,


$ curl -XPUT localhost:9200/twitter/tweet/1?timestamp=2009-11-15T14%3A12%3A12 -d '{
  
"user" : "kimchy",
  
"message" : "trying out Elasticsearch"
}'


만약 timestamp값이 외부나 _source 제공되지 않으면, timestamp 자동으로 document index chain 의해 처리되는 시점의 날짜로 설정될 것이다. 많은 정보는 _timestamp mapping page (https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-timestamp-field.html) 에서 찾아볼 있다.

2015/05/19 09:04 2015/05/19 09:04
[로그인][오픈아이디란?]
오픈아이디로만 댓글을 남길 수 있습니다
Name
Password
Homepage

Secret

02. Index APIs - 02 :: 2015/05/19 08:59

Versioning


index document 버전 번호를 갖는다. 이와 연관된 version number index API request 대한 response 일부분으로 리턴된다. Index API 선택적으로 version parameter 명시되면 optimistic concurrency control (낙관적 병행 수행 제어 : RDBMS 같은 트랜잭션 기반 시스템에 적용되는 concurrency control) 허용한다. 이것은 operation 의도와는 반대로 실행되지 않도록 document 버전을 제어할 것이다. 버전에 대한 훌륭한 use case sample transactional read-and-update 수행하는 것이다. Document 특정 버전을 명시하면 최초에 읽는 동안 변경되지 않은 데이터를 읽을 있다. (업데이트 하기 위해서 데이터를 read하는 경우라면 preference _primary 설정하는 것을 권고한다.) 예를 들면 다음과 같다.


curl -XPUT 'localhost:9200/twitter/tweet/1?version=2' -d '{
  
"message" : "elasticsearch now has versioning support, double cool!"
}'


[NOTE]

Versioning 완전히 real-time (실시간)이다. 그리고 실시간 (near real time) 성인 검색 작업에는 영향을 주지 않는다. Version 제공하지 않을 경우에는 operation 어떤 버전도 체크하지 않고 실행된다.


기본적으로, 내부적인 versioning 1부터 시작하여 update, delete마다 1 증가한다. 선택적으로, version number 외부 (예를 들어, database 저장된 )으로 보강될 있다. 이런 기능을 가능하게 하기 위해서는 version_type external 설정되어야 한다. Version 값은 0이상 9.2e+18 이하의 numeric, long 값이어야만 한다. 매칭되는 version number 체크하는 대신에 External version type 사용할 때는 index request 전달된 version number 현재 저장된 document version 보다 큰지를 알기 위해 시스템에서 체크한다. 만약 크면, document index되고 새로운 number 사용될 것이다. 작거나 같으면 version conflict 발생하고 index operation 실패할 것이다.


Version number database 저장하도록 하면, async indexing operation 대한 strict ordering 유지할 필요가 없다. Database 데이터를 사용하여 elasticsearch index update하는 경우에도 external versioning 사용하면 단순화할 있다. 어떤 이유로든지 index operation 잘못되더라도 가장 마지막 버전이 사용되기 때문이다.


Version types


위에서 언급된 internal, external version type 다음으로, Elasticsearch 특정 use case 대한 다른 type 지원한다. 다음에서 다른 version type 의미에 대해서 살펴보자.


internal

주어진 version 저장된 document version 동일하다면 document index한다.


external or external_gt

주어진 version 저장된 document version보다 크거나 현재 존재하는 document 없으면 document index한다. 주어진 version 새로운 버전으로 사용되고 새로운 document 저장될 것이다. 적용된 버전은 양수의 long number이어야 한다.


external_gte

주어진 version 저장된 document version 이상일 경우 document를 index한다. Document 존재하지 않더라도 어쨌거나 operation 성공할 것이다. 주어진 version 새로운 version으로 사용되고, 새로운 document 함께 저장될 것이다. 적용된 버전은 양수의 long number이어야 한다.


force

저장된 document version과는 상관없이 document index한다. 또는 document 존재하지 않아도 index한다. 주어진 version 새로운 version으로 사용되고, 새로운 document 함께 저장될 것이다. version type 일반적으로 error 완전하게 하기 위해서 사용한다.


[NOTE]

external_gte force version type 주의 깊게 사용해야만 하는 특별한 use case 위해 고안되었다. 부적합하게 사용한다면, 데이터 유실이 발생할 있다.


Operation Type


Index operation 또한 "put-if-absent" 동작을 허용하도록 create operation 강제화 하는데 사용할 있는 op_type을 지원한다. Create 사용되면, index내에 이미 요청한 id document 존재한다면 index operation 실패할 것이다.


op_type parameter 사용하는 예제는 다음과 같다.


$ curl -XPUT 'http://localhost:9200/twitter/tweet/1?op_type=create' -d '{
  
"user" : "kimchy",
  
"post_date" : "2009-11-15T14:12:12",
  
"message" : "trying out Elasticsearch"
}'


다른 형태의 예제는 다음과 같다.


$ curl -XPUT 'http://localhost:9200/twitter/tweet/1/_create' -d '{
  
"user" : "kimchy",
  
"post_date" : "2009-11-15T14:12:12",
  
"message" : "trying out Elasticsearch"
}'

2015/05/19 08:59 2015/05/19 08:59
[로그인][오픈아이디란?]
오픈아이디로만 댓글을 남길 수 있습니다
Name
Password
Homepage

Secret

01. Index APIs - 01 :: 2015/05/19 08:58

섹션에서는 다음 CRUD APIs들을 설명하고 있다.


  • Single document APIs
    • Index API
    • Get API
    • Delete API
    • Update API

  • Multi-document APIs
    • Multi Get API
    • Bulk API
    • Bulk UDP API
    • Delete By Query API

[NOTE]

모든 CRUD API single-index API이다. Index parameter로는 single index 명이나 single index 나타내는 alias 명을 사용한다.


Index API


Index API 특정 index 검색 가능한 형태로 JSON 형식의 document 추가하거나 변경하는데 사용한다. 다음 예제는 "twitter" index id 1 "tweet" type으로 JSON document 추가하는 예제이다.


$ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{
  
"user" : "kimchy",
  
"post_date" : "2009-11-15T14:12:12",
  
"message" : "trying out Elasticsearch"
}'


위의 작업 결과는 다음과 같다.


{
  
"_index" : "twitter",
  
"_type" : "tweet",
  
"_id" : "1",
  
"_version" : 1,
  
"created" : true
}


Automatic Index Creation


Index operation 이전에 index 생성하지 않았다면 자동으로 생성한다. (수동으로 index 생성하는 것에 대해서는 create index API - http://www.elastic.co/guide/en/elasticsearch/reference/current/indices-create-index.html - 참고하라.) 그리고 또한, 이전에 만들지 않았다면 자동으로 입력하는 type 맵핑된 type 자동으로 생성한다. (type mapping 수동으로 생성하는 put mapping API - http://www.elastic.co/guide/en/elasticsearch/reference/current/indices-put-mapping.html - 참고하라.)


Mapping 그자체로 굉장히 유연하고 schema-free하다. 신규 필드와 object 특정 type mapping definition 자동으로 추가될 것이다. Mapping definition 대한 자세한 정보를 얻으려면 mapping section 참고하라.


Index.mapping.allow_type_wrapper true 설정하면, JSON document 형식은 type (JSON mapper 사용하면 매우 유용하다) 포함할 있다.


$ curl -XPOST 'http://localhost:9200/twitter' -d '{
 
"settings": {
  
"index": {
    
"mapping.allow_type_wrapper": true
  
}
 
}
}'
{"acknowledged":true}

$ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{
  
"tweet" : {
      
"user" : "kimchy",
      
"post_date" : "2009-11-15T14:12:12",
      
"message" : "trying out Elasticsearch"
  
}
}'


Automatic index creation 모든 node config 파일에 있는 action.auto_create_index false 설정하여 사용하지 않도록 있다. Automatic mapping creation 모든 node config 파일 (또는 특정 index 설정값) 있는 index.mapper.dynamic 값을 false 설정하여 사용하지 않도록 있다.


Automatic index creation white/black list 기반한 패턴을 포함하고 있을 있다. 예를 들면, action.auto_create_index +aaa*, -bbb*, +ccc*, -* 처럼 설정할 수도 있다. (+ 허용, - 불허를 의미한다.)

2015/05/19 08:58 2015/05/19 08:58
[로그인][오픈아이디란?]
오픈아이디로만 댓글을 남길 수 있습니다
Name
Password
Homepage

Secret

12. URL-based Access Control :: 2015/05/13 16:45

많은 사람들이 URL기반으로 Elasticsearch index 접근하기 위한 Access Control 위해서 Proxy 사용한다. Multi-search, multi-get, bulk request 위해서 사용자는 특정 index 정보는 URL, 개별 request 정보는 request body 담는 것을 선택한다. 이것은 URL 기반 Access Control 어렵게 한다.


URL 있는 특정 index overrding하는 것을 방지하기 위하여 config.yml 파일에 다음 설정을 추가하라.


rest.action.multi.allow_explicit_index: false


기본값은 true지만, false 설정했을 때는 Elasticsearch request body 명시된 특정 index 있다면 request reject한다.

2015/05/13 16:45 2015/05/13 16:45
[로그인][오픈아이디란?]
오픈아이디로만 댓글을 남길 수 있습니다
Name
Password
Homepage

Secret

11. Common Options - 02 :: 2015/05/13 16:45

Distance Units

거리가 필요할 경우, 예를 들어 Geo Distance Filter distance parameter 같은 경우에 아무것도 단위가 명시되어 있지 않을 경우에는 기본적으로 미터단위이다. "1km" "2mi" (miles) 같이 다른 단위로도 distance 명시할 있다. 전체 리스트는 다음과 같다.


mi or miles : Mile

yd or yards : Yard

ft or feet : Feet

in or inch : Inch

km or kilometers : Kilometer

m or meters : Meter

cm or centimeters : Centimeter

mm or millimeters : Millimeter

NM, nmi or nauticalmiles : Nautical Mile


Geohash Cell Filter precision (정밀도) parameter 위에 명시된 unit으로 거리를 표시한다. 하지만, unit 명시되지 않았을 경우에는 geohash 길이로 precision 해석한다.


Fuzziness

어떤 query API fuzziness parameter 사용하여 부정확한 fuzzy matching을 지원한다. Fuzziness parameter query 사용된 field type 따른 context 따른다.


Numeric, date and IPv4 fields

숫자나 날짜, IPv4 field query 있을 , fuzziness +/- margin으로 해석한다. 마치 다음과 같은 Range Query처럼 동작한다.


-fuzziness <= field value <= +fuzziness


Fuzziness parameter 2 2.0처럼 숫자로 표시되어야 한다. Date field 밀리초단위의 long값으로 해석된다. 하지만, 시간 단위를 가진 string - "1h" 같은 - 단위에서 의미하는 값으로 받아들인다. Ip field long이나 다른 IPv4 주소 (long으로 변환될 있는) 수용한다.


String fields

Query string 사용되었을 경우, fuzziness Levenshtein Edit Distance (http://en.wikipedia.org/wiki/Levenshtein_distance) - 하나의 문자가 숫자로 변경되는 - 처리된다.


Fuzziness parameter 다음과 같이 정리할 있다.

0, 1, 2 : Levenshtein Edit Distance 허용되는 최대값

AUTO : 길이에 따라 edit distance 계산함.

0..1 : 정확히 일치하는 경우

1..5 : one edit 허용

>5 : two edit 허용

AUTO fuzziness 대한 최적값을 계산한다.

0.1..1.0 : 공식을 통해서 edit distance 계산한다. Length(term) * (1.0 - fuzziness). 예를 들어 길이 10 가진 fuzziness 0.6이면 edit distance 10 * (1.0 - 0.6) = 4.0이다.


[NOTE]

모든 API 대한 Fuzzy Like This Query (http://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-flt-query.html) 측면에서 edit distance 최대값은 2이다.


Result Casing

모든 REST API case parameter 가질 있다. camelCase 설정될 때는 결과에 속한 모든 field name camel casing 있는 결과를 리턴할 것이다. 아니면 underscore 사용된 결과가 리턴될 것이다. Index source document에는 적용되지 않는다.


JSONP

사용가능할 , 모든 REST API JSONP 결과 , callback parameter 결과를 받을 있다. Config.yaml 파일에 다음 항목을 추가함으로 수행 가능하다.


http.jsonp.enable:true


사용가능하도록 설정되었을 , elasticsearch 아키텍처 때문에 security risk 야기한다는 것에 주의하라. 특정 환경하에서는 attacker 여러분의 브라우저를 이용해 JSONP request 만들어서 Elasticsearch Server 데이터를 탈취할 있다.


Request body in query string

POST 아닌 request 대해서 body 수용하지 않는 library 대해서 string parameter source query 이용해 body 전송할 있다.

2015/05/13 16:45 2015/05/13 16:45
[로그인][오픈아이디란?]
오픈아이디로만 댓글을 남길 수 있습니다
Name
Password
Homepage

Secret
< PREV |  1  |  2  |  3  |  4  |  5  |  6  |  ...  9  |  NEXT >