본문 바로가기

목록이 없습니다.

[Elasticsearch] 여러 인덱스 조회 시 없는 인덱스 조회 해도 에러 결과가 아닌 정상 결과 받도록 처리하는 방법 (how to multi-search non exist index)

Server/Elastic Search

     

    여러 인덱스를 한번에 조회해오는 쿼리 문법인 msearch를 사용하다가 하나의 쿼리에서 여러 인덱스 결과를 한번에 받아올 수 있는 방법이 있는지 찾아보았습니다. 방법은 아래와 같습니다.

     

    원래 msearch 문법

    {"index" : "인덱스이름1"}
    {"query" : "쿼리"}
    {"index" : "인덱스이름2"}
    {"query" : "쿼리"}

    이런식으로 쿼리를 전송하게 되면 결과로 받아오는 구조가 다음과 같이 나옵니다. 마지막에 비어있는 한줄은 msearch의 문법입니다.

     

    {
        "took": 19,
        "responses": [
            {
            	인덱스이름1의 결과 목록
            },
            {
            	인덱스이름2의 결과 목록
            }
        ]
    }

     

     

    인덱스를 여러개 지정 하는 문법

    {"index" : "인덱스이름1,인덱스이름2"}
    {"query" : "쿼리"}

    이런식으로 msearch를 하는 경우 하나의 response 안에 지정해준 인덱스의 검색 결과가 함께 들어옵니다.

     

    {
        "took": 19,
        "responses": [
            {
            	인덱스이름1의 결과 목록,
                인덱스이름2의 결과 목록
            }
        ]
    }

    이 경우 결과를 받아서 파싱하는 부분에서 responses 결과 별로 명시된 인덱스를 보고 어떤 인덱스에서 가져온 것인지 판단해주어야합니다. 일반적인 경우는 더 번거로워 질 수 있습니다. 하지만 인덱스별로 백업인덱스 그러니깐 두번째 인덱스가 있다면 이런 방법으로 지정해줄 수 있습니다. 예를들어 위의 예시를 기준으로 인덱스이름1 안에 원하는 데이터가 없고 인덱스이름2 안에 찾고 있는 데이터가 있는 경우 대체값으로 사용할 수 있습니다.

     

     

    위의 예시는 설명을 위해 간단한 상황을 설정한 것이고 실제로는 아래와 같이 좀 더 복잡한 상황일 때 유용하게 사용할 수 있습니다.

    {"index" : "인덱스이름1,백업1"}
    {"query" : "쿼리"}
    {"index" : "인덱스이름2,백업2"
    {"query" : "쿼리"}
    {"index" : "인덱스이름3,백업3"}
    {"query" : "쿼리"}
    ...

     

    존재하지 않는 인덱스 조회

    말이 이상할 수 있는데 만약에 프로젝트를 하나의 회사에서 개발하는 것이 아니라 출력부분은 회사1, Elasticsearch 데이터 구성은 회사2가 같이 협업하는 경우가 있을 수 있습니다.

    이런 경우 출력 담당 회사1 에서 Elasticsearch 앤드포인트를 활용하여 검색 결과를 받아서 처리하는 부분을 구현하는데 Elasticsearch 데이터 구성을 담당한 회사2에서 말도 없이 인덱스를 바꿀 수 있는 경우가 있습니다(실제로 이러면 .. 스트레스).

    이 때 운영 환경에서는 에러가 발생하게 되는데 좀 더 좋은 사용자 경험을 구현하기 위해서 존재하지 않는 인덱스를 조회하더라도 에러 결과가 아닌 정상 결과를 받아올 수 있는 방법입니다.

     

     

    {"index" : "인덱스이름1*,인덱스이름2*"}
    {"query" : "쿼리"}

    msearch에서 인덱스명을 지정할 때 별표(*) 문자를 넣으면 Wildcard 처럼 사용할 수 있습니다. 예를 들어 test-1, test-2, test-3 인덱스가 있을 때 한꺼번에 3가지 인덱스를 조회하고 싶을 때 아래와 같이 하면 됩니다.

     

    {"index" : "test*"}
    {"query" : "쿼리"}

    이렇게 사용하게 되면 좀 더 가독성 좋게 깔끔하게 여러 인덱스를 지정할 수 있습니다.

     

    또한 이렇게 인덱스 지정 시 Wildcard를 사용하면 패턴에 해당하는 인덱스가 없어도 에러 결과가 아닌 검색결과가 없다는 정상적인 결과를 받아올 수 있습니다.

     

    이렇게 msearch에서 존재하지 않는 인덱스 조회 방법을 정리해보았습니다.

    부족한 글 찾아와주셔서 감사드리고 잘못된 부분 또는 피드백 주시면 감사하겠습니다!

     

    참고

    Elasticsearch 공식 문서

    https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-index.html#hidden

    https://www.elastic.co/guide/en/elasticsearch/reference/current/search-multi-search.html