Skip to main content

Elasticsearch 7.3 활용해보기 #6 – _msearch 여러쿼리를 한번에

계획 없이 포스팅 하기 시작해서 언제까지 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을 보면서 결정하도록 해야겠네요…

ㅂㄷㅂㄷ….

오늘은 여기까지입니다.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.