elasticsearch 다시 조회하기

22298 단어 elasticsearch

elasticsearch 다시 조회하기


디렉터리: 1, 업무 배경: 2, 본론으로 들어가기: 다시 조회하기

1. 비즈니스 배경:


최근의 실제 업무에서 사용자의 주문 데이터를 통계하려면 사용자의 주문 데이터는 사용자가 주문하고 지불하는 과정까지 기록되고 매번 사용자의 주문을 볼 때마다 주문 업데이트 데이터가 발생하지만 역사적 원인으로 인해 사용자의 주문 업데이트 데이터가 입고되지 않고 모두 주문과 관련된 데이터를 es에 저장한다.오늘 어떤 데이터 분석은 사용자의 주문서를 조회하고 주문 차원에 대한 분석을 다시 해야 한다.

2. 본론으로 들어가기: 다시 조회하기


2.1, 관계형 데이터베이스 처리


일반 관계형 데이터베이스에서 직접 sql의distinct 함수를 다시 통계하면 실현할 수 있습니다.
통계를 다시 가져온 수량:
select distinct(count(1)) from order;

중복 제거 결과 얻기:
select distinct order_id from order;

2.2,es에서 조회 처리 방법


통계를 다시 가져온 후의 수량은 일반적으로 Cardinality 집합 함수를 사용하는데 DSL의 예는 다음과 같다.
GET /index_name/_search
{
	"size": 1,
	"_source": {
		"includes": [" "],
		"excludes": []
	},
	"query": {
		"bool": {
			" ": " term/terms/filter "
		}
	},
	"aggregations": {
		"cardinality_field": {
			"cardinality": {
				"field": " "
			}
		}
	}
}

위의 DSL이 반환됩니다.
{
  "took": 7,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": null,
    "hits": [
      
    ]
  },
  "aggregations": {
    "cardinality_field": {
      "value": 1
    }
  }
}

실행 결과에서 볼 수 있듯이 조회 결과는 3개의 데이터로 특정한 필드를 통해 집합을 한 후에 하나만 부합된다. 또한 우리는 이러한 Cardinality 집합 함수를 통해 나는 구체적으로 그 데이터가 요구에 부합되는지 모른다.
Java-api 사용:
jar 패키지:

<dependency>
    <groupId>org.elasticsearch.clientgroupId>
    <artifactId>transportartifactId>
    <version> version>
dependency>

Java 코드:
// DSL
 cardinalityBuilder = AggregationBuilders.cardinality("uid_aggs").field("orderId");
SearchRequestBuilder request = client.prepareSearch("XXXX")
		.setTypes("XXX")
		.setSearchType(SearchType.QUERY_THEN_FETCH)
		.setQuery(QueryBuilders.boolQuery()
				.must(QueryBuilders.termQuery("orderId", "")))
		.addAggregation(cardinalityBuilder)
		.setSize(1);
// 		
SearchResponse response = request.execute().actionGet();

중복 제거 결과 얻기: 5.3 버전 이전에는 top_hits 집합, 그러나 5.3 이상의 버전은 여전히 사용할 수 있습니다. DSL은 다음과 같습니다.
POST /index_name/
{
	"size": 0,
	"query": {
		"bool": {

		}
	},
	"aggregations": {
		"uid_top": {
			"top_hits": {
				"sort": [{
					"orderId": {
						"order": "desc"
					}
				}],
				"size": 1,
				"_source": {
					"includes": [
						"orderId"
					],
					"excludes": []
				}
			}
		}
	}
}

위의 DSL에서 다시 실행 후 결과 복귀 필드를 설정했습니다.
{
  "took": 4,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "uid_top": {
      "hits": {
        "total": 3,
        "max_score": null,
        "hits": [
          {
            "_index": "",
            "_id": "",
            "_score": null,
            "_source": {
              "order_id": ""
            },
            "sort": [
              ""
            ]
          }
        ]
      }
    }
  }
}

java-api 참조:
// :
AggregationBuilder aggregationBuilder = AggregationBuilders.terms("orderId_aggs").field("orderId").size(10000).subAggregation(AggregationBuilders.topHits("uid_top").addSort("offline_time", SortOrder.DESC).setSize(1));

참고:
es5.3 버전 이상에는 필드 축소(Field Collapsing) 기능이 추가되었습니다. 필드 축소란 특정 필드를 병합하여 중복시키는 것을 이해합니다. DSL의 예는 다음과 같습니다.
{
	"size": 100,
	"query": {
		" "
	},
	"collapse": {
		"field": "orderId"
	}
}

상기 DSL이 되돌아오는 결과에 중복된 데이터를 직접 필터링하고 같은 데이터는 하나만 되돌아오므로 후속적인 다른 차원 분석에 유리하다.
java-api 참조:
CollapseBuilder collapseBuilder = new CollapseBuilder("orderId");
    
SearchRequestBuilder requestBuilder = transportClient.prepareSearch("XXX").setTypes("XXX")
                .setSize(111).setQuery(queryBuilder).setCollapse(collapseBuilder);

끝:
여기에 와서 저는 개인적으로 엘라스틱 검색에 대한 재조회의 기본적인 총결이 끝났습니다. 여러분의 비판과 지적을 환영합니다.

좋은 웹페이지 즐겨찾기