R의 elasticsearch 모듈(https://github.com/ropensci/elastic)이 있으며, 설치는 아래와 같이 한다.
install.packages("elastic")
모듈 임포트는 다음과 같이 한다.
현재 69가지 지원하는 api는 다음과 같다.
ls('package:elastic')
[1] "alias_create" "alias_delete"
[3] "alias_exists" "alias_get"
[5] "aliases_get" "cat_"
[7] "cat_aliases" "cat_allocation"
[9] "cat_count" "cat_fielddata"
[11] "cat_health" "cat_indices"
[13] "cat_master" "cat_nodes"
[15] "cat_pending_tasks" "cat_plugins"
[17] "cat_recovery" "cat_segments"
[19] "cat_shards" "cat_thread_pool"
[21] "cluster_health" "cluster_pending_tasks"
[23] "cluster_reroute" "cluster_settings"
[25] "cluster_state" "cluster_stats"
[27] "connect" "connection"
[29] "count" "docs_bulk"
[31] "docs_create" "docs_delete"
[33] "docs_get" "docs_mget"
[35] "es_parse" "explain"
[37] "field_mapping_get" "index_analyze"
[39] "index_clear_cache" "index_close"
[41] "index_create" "index_delete"
[43] "index_exists" "index_flush"
[45] "index_get" "index_open"
[47] "index_optimize" "index_recovery"
[49] "index_segments" "index_settings"
[51] "index_settings_update" "index_stats"
[53] "index_status" "index_upgrade"
[55] "mapping_create" "mapping_delete"
[57] "mapping_get" "mlt"
[59] "nodes_hot_threads" "nodes_info"
[61] "nodes_shutdown" "nodes_stats"
[63] "ping" "scroll"
[65] "Search" "search_shards"
[67] "Search_uri" "tokenizer_set"
[69] "type_exists"
간단한 예제는 다음과 같다.
conn <- connect(es_base="http://abc.google.com" ,es_port=9200)
exist <- alias_exists(alias="search_autocomplete")
docs_get(index = 'search_autocomplete', type = 'read', id = 4)
질의시에는 json으로 할 수 있고,
body <- '{
"query": {
"query_string": {
"query" : "backup"
}
}
}'
out <- Search('search_autocomplete', 'read', body=body)
list를 이용해서도 진행할 수 있다.
body <- list(query = list(query_string = list(query = "backup")))
out <- Search('search_autocomplete', 'read', body=body)
구현은 아주 간단히 http rest api를 감싼 형태를 구현하였다.
그러나, 이슈가 하나 있는데, api에서 본 것처럼 elasticsearch 연결 정보는 오직 하나만 쓸 수 있다.
(R 모듈을 많이 쓰다보면, 같이 사용하는 전역 변수 이름 때문에 문제가 되는 경우가 있다.)
즉, 하나의 es만 써야 한다. 동시에 2개 es를 연결해서 migration 하거나 데이터를 같이 작업해야 하는 것은 할 수 없다.
* 그래서 (나는) 여러 es에서 쓸 수 있도록 해당 소스를 수정해서 개발했다.
수정하는데 그렇게 어렵지 않아서 쉽게 쓸 수 있을 것이다.