should 쿼리 vs msearch

개발새발·2022년 5월 7일
0

elasticsearch

목록 보기
21/54

특정 쿼리들만을 가지고 ES검색을 해야하는 경우가 생겨서, 찾아보다가 msearchshould 사용하면 원하는대로 나올 수 있을거란 결론이 나왔다. (그런데 msearch 여러 쿼리에 대한 결과가 각각 나오기 때문에, aggregation을 한 후에 sort나 limit를 거는게 너무 어려웠다.) 그래서 테스트를 진행해봤다. 물론, 서비스마다 성능이 다르니 결과가 다르게 나올 수도 있다는 점에 유의하길 바란다.


👩‍🍳 일단, 사용하고자하는 쿼리형태는 아래와 같다.

  • msearch
{"index" : "test1"}
{"query":{"bool":{"must":[{"match" : {"text field": "어쩌구"}}],"filter":[{"term":{"filter field":"저쩌구"}]}},"size" : 10, "limit" : 20}
{"index" : "test2"}
{"query":{"bool":{"must":[],"filter":[{"term": {"filter field" : "저쩌구"}},{"term":{"filter field":"저쩌구"}}]}},"size" : 10, "limit" : 20}
  • should
{
  "body": {
    "query": {
      "bool": {
        "should": [
          {
            "bool": {
              "must": [
                {
                  "terms": {
                    "_index": [
                      "test1"
                    ]
                  }
                },
                {
                  "match": {
                    "text field": "어쩌구"
                  }
                }
              ],
              "filter": {
                "bool": {
                  "must": [
                    {
                      "term": {
                        "filter field": "저쩌구"
                      }
                    }
                  ]
                }
              }
            }
          },
          {
            "bool": {
              "must": [
                {
                  "terms": {
                    "_index": [
                      "test2"
                    ]
                  }
                }
              ],
              "filter": {
                "bool": {
                  "must": [
                    {
                      "term": {
                        "filter field": "저쩌구"
                      }
                    },
										{
                      "term": {
                        "filter field": "저쩌구"
                      }
                    }
                  ]
                }
              }
            }
          }
        ]
      }
    },
    "_source": [
      "필드들"
    ],
    "from": 0,
    "size": 20,
    "sort": {
      "sort할거": "asc"
    }
  },
  "index": "test1, test2"
}

🕵️‍♀️그렇다면 성능차이는?

shouldmsearch
_source사용사용
쿼리 지정 size100100
query문(msearch의 경우에는 index+query문)3030
ES 클라이언트하나에서 진행하나에서 진행
평균 처리량390.98ops/s10.07ops/s
에러량5.6%96.57%

에러량이 나오는 이유는 다시 한번 봐야한다.
처리량이 아직 똥이라 개선이 하루빨리 필요하다.. 💩


결론

should가 잘 나오긴 했는데, msearch 는 결국 (각 쿼리문 지정 사이즈 100)*(query문 수) = 3000개의 결과를 내고 should 는 쿼리 지정 size인 100개의 결과를 반환해준다. 이렇게 되면 테스트 조건이 다르다고 봐야하나? 라는 의문이 생기는데, 결과적으로 봤을 때 msearch 를 어플리케이션내에서 다시 aggregation 한 후, 다시 sort랑 limit 을 해줘야한다는 부분과 되도록이면 적은 결과의 문서를 반환해주는 게 좋을 것 같다는 판단하에 should 를 사용하기로 했다. 🤓

profile
발새발개

0개의 댓글