R의 elasticsearch 모듈(https://github.com/ropensci/elastic)이 있으며, 설치는 아래와 같이 한다.


install.packages("elastic")


모듈 임포트는 다음과 같이 한다.


library("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에서 쓸 수 있도록 해당 소스를 수정해서 개발했다. 

수정하는데 그렇게 어렵지 않아서 쉽게 쓸 수 있을 것이다. 








Posted by '김용환'
,