Elasticsearch에서 희소, 밀집 및 지리 필드를 결합한 통합 검색 기술

다양한 희소, 밀집 및 지리 필드를 사용자 정의 방식으로 결합하는 방법

Elasticsearch는 데이터를 거의 실시간으로 검색하고 분석할 수 있는 강력한 도구입니다. 개발자로서 우리는 다양한 유형의 필드를 포함하는 데이터셋을 자주 다루게 됩니다. 일부 필드는 필수적이거나 대량의 데이터를 포함하고 있으며, 다른 필드는 거의 데이터가 없을 수 있습니다. 값이 많이 누락된 필드를 '희소' 필드라고 하며, 대부분의 값이 존재하는 필드를 '밀집' 필드라고 합니다. 물론 위치 데이터를 나타내는 지리 필드도 있습니다.

이 글에서는 다양한 필드를 포함하는 데이터를 쿼리하는 방법을 탐구할 것입니다.

희소, 밀집 및 지리 필드를 통합하여 검색 기능을 향상시키는 방법을 살펴볼 것입니다. 가장 좋아하는 products 인덱스를 사용하여 실습 예제를 통해 Elasticsearch에서 샘플 데이터를 가져오고 어휘 및 지리 검색을 수행할 것입니다.

이러한 필드를 결합하여 더 깊은 분석 능력을 추출하는 방법을 자세히 설명하기 전에, 먼저 이러한 필드를 정의해 보겠습니다.

희소 필드

희소 필드는 각 문서에 존재하지 않는 필드입니다.

예를 들어, 다양한 유형의 제품을 포함하는 products 인덱스를 고려해 보겠습니다. products 인덱스의 limited_edition 필드는 희소합니다. 왜냐하면 모든 제품이 한정판으로 출시되는 것은 아니기 때문입니다. 마찬가지로 category 또는 inventory_info와 같은 다른 필드는 모든 제품에 적용되지 않을 수 있습니다. 희소 필드는 특정 데이터 하위 집합에만 존재하는 속성을 기반으로 결과를 필터링하는 데 매우 유용합니다.

밀집 필드

반대로, 밀집 필드는 모든 또는 대부분의 문서에 나타나는 필드입니다. products 인덱스에서 name, manufacturer, price, release_date와 같은 필드는 밀집 필드입니다. 이들은 대부분의 제품에 적용되며 각 문서의 핵심입니다. 이들은 신뢰할 수 있는 검색 쿼리를 제공하는 데 도움이 됩니다.

지리 필드

지리 필드를 사용하면 지리 데이터를 색인화하여 위치 또는 지리적 영역을 기반으로 검색할 수 있습니다. products 인덱스의 origin_location은 제품의 원산지 위치를 나타낼 수 있는 지리 필드입니다.

다양한 필드 결합

사용자 정의 방식으로 이러한 필드를 결합하면 검색 기능을 크게 향상시키고 더 관련성 높은 결과를 제공할 수 있습니다. 많은 사용 사례에서 우리는 희소 필드를 밀집 필드와 지리 필드와 결합하여 쿼리하고 싶을 것입니다.

Elasticsearch의 강력한 점은 복잡한 쿼리를 처리하고 다양한 데이터 유형을 결합할 수 있는 능력에 있습니다. 희소, 밀집 및 지리 필드의 특성을 이해함으로써 특정 사용자 요구 사항에 맞는 정확한 검색 쿼리를 생성할 수 있습니다.

실제 예제를 통해 이러한 다양한 데이터 필드를 사용하는 방법을 살펴보겠습니다.

"products" 인덱스 생성

먼저, 온라인 쇼핑몰에 적용할 수 있는 다양한 필드 유형을 포함하는 products 인덱스를 정의해 보겠습니다.

아래 PUT 요청에서 products 인덱스의 매핑은 일부 표준 제품 속성을 포함합니다. 그러나 다음과 같은 필드는 모든 제품에 적용되지 않을 수 있다는 점을 알 수 있습니다:

  • in_stock
  • limited_edition

이러한 속성은 모든 제품에 채워지지 않을 수 있으므로 희소 필드로 간주됩니다. name, manufacturer, release_date와 같은 다른 필드는 모든(또는 대부분의) 제품에 나타날 것으로 예상됩니다.

우리는 이러한 필드를 제품의 원산지 위치를 나타낼 수 있는 지리 지점 필드와 결합하고자 합니다:

# products 매핑 스키마 생성
PUT /products
{
  "mappings": {
    "properties": {
      "name": { "type": "text" },
      "manufacturer": { "type": "text" },
      "price": { "type": "float" },
      "categories": { "type": "keyword" },
      "release_date": { "type": "date" },
      "in_stock": { "type": "integer" },
      "limited_edition": { "type": "boolean" },
      "origin_location": { "type": "geo_point" },
      "product_type": { "type": "keyword" },
      "language": { "type": "keyword" }
    }
  }
}

위 코드 스니펫은 products 인덱스의 매핑 스키마를 보여줍니다. 이는 희소, 밀집 및 지리 필드의 조합을 포함합니다.

코드 스니펫을 Kibana 콘솔에 복사하여 붙여넣으세요. 실행하면 products 인덱스가 생성됩니다.

이제 매핑을 생성했으므로 샘플 데이터를 색인화해 보겠습니다.

샘플 데이터 색인화

우리는 요구 사항을 대표할 수 있는 샘플 제품 데이터를 색인화하고자 합니다. 다음 샘플 문서는 이러한 속성 조합을 가진 제품을 추가합니다:

# limited_edition 필드 생략
# 위치는 뉴욕
POST /products/_doc/1
{
  "name": "Effective Java: The Definitive Guide",
  "manufacturer": "Joshua Bloch, Cay S. Horstmann",
  "price": 49.99,
  "categories": ["programming", "Java", "advanced"],
  "release_date": "2023-11-15",
  "in_stock": 25,
  "origin_location": { "lat": 40.7128, "lon": -74.0060 },
  "product_type": "Technology",
  "language": "English",
  "technology": "Java"
}

# 위치는 도쿄
POST /products/_doc/2
{
  "name": "Advanced Elasticsearch Techniques",
  "manufacturer": "Hiroshi Tanaka",
  "price": 44.99,
  "categories": ["Elasticsearch", "Search", "Technology", "Advanced"],
  "release_date": "2022-09-10",
  "in_stock": 15,
  "origin_location": { "lat": 35.6762, "lon": 139.6503 },
  "product_type": "Technology",
  "limited_edition": true,
  "language": "Japanese",
  "technology": "Elasticsearch"
}

# in_stock, limited_edition 및 origin_location 필드 생략
POST /products/_doc/3
{
  "name": "Modern JavaScript Patterns",
  "manufacturer": "Sarah Johnson",
  "price": 39.99,
  "categories": ["JavaScript", "Web Development", "Frontend"],
  "release_date": "2021-05-20",
  "product_type": "Technology",
  "language": "English",
  "technology": "JavaScript"
}

보시다시피, 우리는 세 가지 다른 제품이 있으며 각 제품에는 일부 필드가 누락되어 있습니다. 이는 희소 필드의 개념을 보여줍니다.

데이터 준비가 완료되면 다음 단계는 이러한 다양한 필드가 흥미로운 분석 인사이트를 생성할 수 있도록 쿼리를 작성하는 것입니다.

다음 쿼리를 작성할 것입니다:

  • 특정 위치 근처의 Java 제품 찾기
  • 한정판 기술 서적 검색
  • 최신 다국어 IT 제품 검색

이 글의 나머지 부분에서는 희소, 밀집 및 지리 필드를 결합하는 쿼리를 생성하는 방법을 설명합니다.

특정 위치 근처의 Java 제품 찾기

특정 위치(예: 뉴욕 메트로폴리탄 지역) 근처의 Java 관련 제품을 찾고 싶다고 가정해 보겠습니다. 우리는 특정 지리 영역 내에서 Java 관련 제품을 일치시키기 위해 bool 쿼리를 작성해야 합니다. 다음 쿼리가 이 작업을 수행할 수 있습니다:

여기서 우리는 뉴욕 근처의 Java 관련 제품을 찾습니다:

# 뉴욕에서 Java 제품 검색
GET /products/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "technology": "Java" } }
      ],
      "filter": [
        { "geo_distance": { "distance": "150km", "origin_location": { "lat": 40.730610, "lon": -73.935242 } } }
      ]
    }
  }
}

이 쿼리를 실행하면 "뉴욕"에서 150km 이내의 "Java" 제품이 반환됩니다. 이 경우 "Effective Java"가 반환됩니다.

이 쿼리는 필드 유형을 결합하여 특정 검색 목표를 달성합니다. 쿼리는 "Java"와 관련된 특정 제품을 찾습니다. 이는 technology 필드로, 인덱스의 모든 항목에 채워지지 않을 수 있습니다. 이는 희소 필드 시나리오입니다. 이 예제는 Elasticsearch가 다양한 데이터 유형을 일관된 검색 전략으로 통합하는 방법을 보여줍니다.

한정판 기술 서적 쿼리

데이터베이스에서 검색 기술(예: Elasticsearch)과 관련된 한정판 제품을 식별하고자 한다고 가정해 보겠습니다. 이 쿼리는 해당 기술을 깊이 학습하고자 하는 특정 대상에게 유용할 수 있는 제품을 추출합니다.

다시 bool 쿼리를 사용하여 검색 기술과 관련된 한정판 제품을 필터링합니다:

# 한정판 기술 제품
GET /products/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "limited_edition": true } },
        { "match": { "technology": "Elasticsearch" } }
      ],
      "should": [
        { "match": { "language": "Japanese" } }
      ],
      "must_not": [
        { "range": { "release_date": { "lt": "2020-01-01" } } }
      ],
      "minimum_should_match": 1
    }
  }
}

이 쿼리는 limited_edition 필드(희소 필드)와 product_type 필드(밀집 필드)를 기반으로 제품을 필터링합니다. product_type은 모든 제품 문서에 존재할 수 있으므로 밀집 필드로, 쿼리가 전체 데이터 세트에서 더 일반적으로 적용 가능하게 만듭니다.

위의 요구 사항 외에도, 우리는 제품이 영어로 출판되기를 선호합니다( minimum_should_match를 1로 설정했으므로 엄격한 요구 사항은 아닙니다). 이는 제품이 영어로 출판되지 않더라도 검색 결과에서 제외되지 않음을 의미합니다. 그러나 영어로 출판된 경우, 이러한 제품은 검색 결과에서 더 높은 순위를 받을 것입니다.

완전성을 위해 must_not 절도 추가했습니다. 이는 2020년 이전에 출판된 제품을 제외합니다. 이를 통해 최신 출판물에만 집중할 수 있습니다.

요약하자면, 이 쿼리는 균형 잡힌 검색 방법을 제공합니다:

  • 버전 및 유형에 따라 제품을 필터링하는 엄격한 조건 사용,
  • 관련성을 높이기 위해 영어 언어 기본 설정 설정, 그리고
  • 최신 사본만 가져오도록 이전 출판물 제외.

최신 다국어 IT 제품 검색

사용자가 기술 분야의 최신 동향을 유지하기 위해 최신 IT 리소스(제품)를 찾고 있지만 모국어(특정 언어)로 자료를 얻을 수 있기를 원할 수 있습니다. 이는 교육 환경, 다국적 기업 또는 이중 언어 인구 지역에서 흔한 경우입니다. 나는 "말라얄람어"(인도 남부의 언어 - 내 모국어)로 된 기술 서적을 읽지 않지만, 일부 친구들이 모국어로 기술 내용을 설명하는 것을 선호한다는 것을 알고 있습니다.

영어와 프랑스어로 읽을 수 있는 최신 IT 제품을 찾고 싶다고 가정해 보겠습니다. 이는 더 넓은 교육적 가치를 나타낼 수 있습니다:

# 다국어 최신 IT 제품
GET /products/_search
{
  "query": {
    "bool": {
      "must": [
        { "range": { "release_date": { "gte": "now-1y" } } }
      ],
      "filter": [
        { "terms": { "language": ["English", "French"] } },
        { "match": { "product_type": "Technology" } }
      ]
    }
  }
}

"결합/다양화" 필드의 맥락에서 쿼리를 설명해 보겠습니다:

release_date는 모든 제품 기록에 예상되는 표준 속성이므로 밀집 필드일 수 있습니다. 범위 쿼리를 사용하여 최근 1년 내에 출판된 제품에 집중합니다.

마찬가지로, product_type은 일반적으로 제품 데이터베이스에서 밀집 필드입니다. 제품은 일반적으로 유형별로 분류되기 때문입니다. 쿼리는 "기술" 유형의 제품을 필터링합니다. 이를 통해 IT 주제와 관련된 제품을 보장합니다.

language 필드는 데이터 세트에 따라 희소 필드로 간주될 수 있습니다. 전 세계 데이터 세트에서 제품은 여러 언어 버전을 가질 수 있지만 모든 제품이 여러 언어 버전을 가질 필요는 없습니다.

terms 쿼리를 사용하여 여러 언어(이 경우 영어와 프랑스어)를 필터링함으로써, 우리는 다국어 대상을 수용하는 제품을 얻고 있습니다.

태그: elasticsearch search geospatial sparse fields dense fields

7월 8일 02:42에 게시됨