계획 없이 포스팅 하기 시작해서 언제까지 elasticsearch에 대해서 적을지에 대한 계획은 없습니다.
기존에 _search api를 통해서 검색을 해보았는데, 실무에 활용하다보니 갈수록 쿼리가 많아지게 되어서 찾아보니… 여러개의 쿼리를 한번에 보낼 수 있는 방법이 있었습니다.
쿼리가 호출되는 단위를 묶어주니 그만큼의 네크워크 지연시간이 줄어들 수 있겠죠. 전송량도 중요하지만, 전송되는 횟수도 속도에 영향을 많이 줍니다.
여러개의 쿼리 한번에 처리하기
이번에도 kibana console에서 처리해볼겁니다. 실제로는 PHP로 처리중이지만, PHP로 하는 것은 어느정도 여유가 되면 정리해 두겠습니다. #5에서 대량으로 자료를 등록한 _bulk api와 비슷합니다.
이용하는 api는 Multi Search… _msearch 입니다. 자세한 내용은 다음 링크에서 봐주세요.
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-multi-search.html
GET _msearch {"index" : "my_index"} {"query": { "query_string": {"fields": ["title","note"],"query": "*청산*" } },"size":"0" } {"index" : "my_index"} {"query": { "query_string": {"fields": ["title","note"],"query": "*별곡*" } } } {"index" : "my_index"} {"query": { "query_string": {"fields": ["title","note"],"query": "*별곡*" } } }
인덱스를 지정해주고 2라인이 한쌍이 되게 됩니다. 첫번째 줄은 인덱스를 지정해주고 두번째 줄은 쿼리를 작성합니다. _bulk와 마찬가지로 쿼리는 한줄에 다 작성해줘야합니다. (그렇지 않으면…… )
_msearch에서 count 구하기
이전 버전에서는 search_type을 count로 주면 검색되는 문서의 갯수를 알수 있엇지만, 현재 버전에서는 작동하지 않는것 같습니다. 그래서 쿼리에 “size”:”0″를 추가하여 내용을 생략한 갯수만 구해 올 수도 있습니다. (이거땜에 한참 해메였음)
{ "took" : 2, "responses" : [ { "took" : 2, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }, "status" : 200 }, { "took" : 2, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "my_index", "_type" : "_doc", "_id" : "Dt4MH20BjjMy29Rvz-kp", "_score" : 1.0, "_source" : { "title" : "청산별곡", "note" : "살어리 살어리랏다 靑山에 살어리랏다. 멀위랑 달래 먹고 靑山에 살어리랏다.얄리얄리 얄랑셩 얄라리 얄라" } }, { "_index" : "my_index", "_type" : "_doc", "_id" : "Ed4MH20BjjMy29Rvz-kp", "_score" : 1.0, "_source" : { "title" : "西京별곡", "note" : "西京이 아즐가 西京이 셔울히 마르는 위 두어렁셩 두어렁셩 다링디리" } } ] }, "status" : 200 }, { "took" : 2, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "my_index", "_type" : "_doc", "_id" : "Dt4MH20BjjMy29Rvz-kp", "_score" : 1.0, "_source" : { "title" : "청산별곡", "note" : "살어리 살어리랏다 靑山에 살어리랏다. 멀위랑 달래 먹고 靑山에 살어리랏다.얄리얄리 얄랑셩 얄라리 얄라" } }, { "_index" : "my_index", "_type" : "_doc", "_id" : "Ed4MH20BjjMy29Rvz-kp", "_score" : 1.0, "_source" : { "title" : "西京별곡", "note" : "西京이 아즐가 西京이 셔울히 마르는 위 두어렁셩 두어렁셩 다링디리" } } ] }, "status" : 200 } ] }
3개의 블럭으로 데이터를 받아오는 것을 볼 수 있습니다. 갯수는 hits.total.value가 검색한 문서의 갯수입니다.
뭔가 쓸수록 매력이 있는것 같습니다. 이렇게 하고나서 40%정도의 속도 향상이 있었어요.. 노드를 추가하는 것이 더 성능이 좋을것 같긴합니다만… (환경이 -_-.. )
데이터의 상황에 따라서 took을 보면서 결정하도록 해야겠네요…
ㅂㄷㅂㄷ….
오늘은 여기까지입니다.