특정 쿼리들만을 가지고 ES검색을 해야하는 경우가 생겨서, 찾아보다가
msearch
와should
사용하면 원하는대로 나올 수 있을거란 결론이 나왔다. (그런데msearch
여러 쿼리에 대한 결과가 각각 나오기 때문에, aggregation을 한 후에 sort나 limit를 거는게 너무 어려웠다.) 그래서 테스트를 진행해봤다. 물론, 서비스마다 성능이 다르니 결과가 다르게 나올 수도 있다는 점에 유의하길 바란다.
{"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}
{
"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"
}
should | msearch | |
---|---|---|
_source | 사용 | 사용 |
쿼리 지정 size | 100 | 100 |
query문(msearch의 경우에는 index+query문) | 30 | 30 |
ES 클라이언트 | 하나에서 진행 | 하나에서 진행 |
평균 처리량 | 390.98ops/s | 10.07ops/s |
에러량 | 5.6% | 96.57% |
에러량이 나오는 이유는 다시 한번 봐야한다.
처리량이 아직 똥이라 개선이 하루빨리 필요하다.. 💩
should
가 잘 나오긴 했는데, msearch
는 결국 (각 쿼리문 지정 사이즈 100)*(query문 수) = 3000개의 결과를 내고 should
는 쿼리 지정 size인 100개의 결과를 반환해준다. 이렇게 되면 테스트 조건이 다르다고 봐야하나? 라는 의문이 생기는데, 결과적으로 봤을 때 msearch
를 어플리케이션내에서 다시 aggregation 한 후, 다시 sort랑 limit 을 해줘야한다는 부분과 되도록이면 적은 결과의 문서를 반환해주는 게 좋을 것 같다는 판단하에 should
를 사용하기로 했다. 🤓