ElasticSearch

[엘라스틱 서치] Search your data - 검색 API (4)

고루5 2024. 4. 30. 10:10

이 시리즈에서는 엘라스틱서치 가이드(:8.13) 의 Search your data 챕터에 대해 다루고 있습니다.

https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html


Search multiple data streams and indices

Elasticsearch에서 여러 인덱스를 두는 경우, 검색을 하기 위해 여러개의 인덱스에서 검색이 필요할 수 있습니다. 

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-multiple-indices.html 에서는 여러 인덱스에서 검색하는 방법을 다루고 있습니다.

 

1. 쉼표를 사용해 여러 데이터 스트림(또는 여러 인덱스)에서 검색하기

GET /my-index-000001,my-index-000002/_search
{
  "query": {
    "match": {
      "user.id": "kimchy"
    }
  }
}

 

2. 인덱스 패턴을 사용해 검색하기

my-index-*로 시작하는 모든 인덱스에 대해 아래를 검색합니다.

GET /my-index-*/_search
{
  "query": {
    "match": {
      "user.id": "kimchy"
    }
  }
}

 

3. 모든 인덱스 한번에 검색하기

/* , _all, " " 등을 사용해 모든 인덱스를 한번에 지정할 수 있습니다.

GET /_search
{
  "query": {
    "match": {
      "user.id": "kimchy"
    }
  }
}

GET /_all/_search
{
  "query": {
    "match": {
      "user.id": "kimchy"
    }
  }
}

GET /*/_search
{
  "query": {
    "match": {
      "user.id": "kimchy"
    }
  }
}

 

이 외에도 index의 alias(별칭)을 활용해 검색하기 (같은 별칭을 사용하는 모든 인덱스를 대상으로 검색) 등이 있음

수 있습니다.

여러 인덱스를 검색할 때 indices_boost변수를 사용하여 지정된 특정 인덱스에 높은 가중치를 부여할 수 있습니다.

GET /_search
{
  "indices_boost": [
    { "my-index-*": 1.4 },
    { "my-index-000002": 1.3 }
  ]
}

 

💡일치하는 항목이 여러 개 발견되면 첫 번째 일치 항목이 사용됩니다. 예를 들어, my-index-000002는 my-index*부스트 값이 적용되어 1.4가 됩니다.

 

Collapse search results

collapse파라미터는 특정 필드 값을 기준으로 중복된 결과를 제거하는 기능을 제공합니다.

GET my-index-000001/_search
{
  "query": {
    "match": {
      "message": "GET /search"
    }
  },
  "collapse": {
    "field": "user.id"         
  },
  "sort": [
    {
      "http.response.bytes": { 
        "order": "desc"
      }
    }
  ],
  "from": 0                    
}

위의 예시는 "user.id"를 기준으로 중복된 값을 제거하고, "http.response.."값으로 정렬합니다.

 

"collapse"가 적용되었다면, 각 "collapse" 그룹 내에서 가장 관련성이 높은 문서 하나만 포함됩니다.

Define the offset of the first collapsed result

 

collapse에 사용되는 필드는 단일 값, numeric필드로 구성되어야 합니다. 

또한 collapse는 top hits에만 적중되고, 집계에는 영향을 주지 않습니다.

참고로 응답값에서 total num of hits는 collapse와 무관하게 문서 수를 나타냅니다.

ex) 동일한 문서가 인덱스들에 두개 들어있을때, collapse 적용 시 -> hit.total.value : 2 (*그러나 표시되는 값은 1개임)

 

collapse"된 결과 내에서 각 그룹에 대한 내부 검색 결과 얻기

inner_hits : 각 "collapse" 그룹에 대한 상세 정보를 얻기 위해 사용됩니다.

 

GET /my-index-000001/_search
{
  "query": {
    "match": {
      "message": "GET /search"
    }
  },
  "collapse": {
    "field": "user.id",                       
    "inner_hits": {
      "name": "most_recent",                  
      "size": 5,                              
      "sort": [ { "@timestamp": "desc" } ]    
    },
    "max_concurrent_group_searches": 4        
  }
}

이 예시에서는

1. "collapse"를 사용하여 "user_id" 필드를 기준으로 중복된 결과를 제거합니다.

2. 각 그룹 내에서 가장 관련성이 높은 문서 하나만 반환합니다.

3. "inner_hits"를 사용하여 "most_recent"라는 이름으로 내부 검색 결과를 지정하고, collapse그룹 내 최근 5개의 결과를 가져옵니다.

4. 결과는 "@timestamp" 필드를 기준으로 내림차순으로 정렬됩니다.

 

실습결과를 바탕으로,

- collapse는 문서 하나만을 반환한다.

- inner_hits는 추가 조건을 사용해 몇개를 더 가져올 수 있다.

를 확인할 수 있었습니다.

 

또한 innner_hits를 사용하여, 두번째 레벨(자식레벨)에서 collapse를 사용할 수 있습니다. (최대 레벨2까지만 가능함)

GET /my-index-000001/_search
{
  "query": {
    "match": {
      "message": "GET /search"
    }
  },
  "collapse": {
    "field": "geo.country_name",
    "inner_hits": {
      "name": "by_location",
      "collapse": { "field": "user.id" },
      "size": 3
    }
  }
}

Collapsing with search_after

"search_after" 매개변수는 Elasticsearch에서 페이징된 검색 결과를 지속하기 위해 사용됩니다. 이 매개변수를 사용하면 이전 검색 결과의 마지막 문서를 기준으로 새로운 검색을 시작할 수 있습니다.

GET /my-index-000001/_search
{
  "query": {
    "match": {
      "message": "GET /search"
    }
  },
  "collapse": {
    "field": "user.id"
  },
  "sort": [ "user.id" ],
  "search_after": ["dd5ce1ad"]
}