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);
끝:
여기에 와서 저는 개인적으로 엘라스틱 검색에 대한 재조회의 기본적인 총결이 끝났습니다. 여러분의 비판과 지적을 환영합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
kafka connect e elasticsearch를 관찰할 수 있습니다.
No menu lateral do dashboard tem a opção de connectors onde ele mostra todos os clusters do kafka connect conectados atu...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
select distinct(count(1)) from order;
select distinct order_id from order;
GET /index_name/_search
{
"size": 1,
"_source": {
"includes": [" "],
"excludes": []
},
"query": {
"bool": {
" ": " term/terms/filter "
}
},
"aggregations": {
"cardinality_field": {
"cardinality": {
"field": " "
}
}
}
}
{
"took": 7,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 3,
"max_score": null,
"hits": [
]
},
"aggregations": {
"cardinality_field": {
"value": 1
}
}
}
<dependency>
<groupId>org.elasticsearch.clientgroupId>
<artifactId>transportartifactId>
<version> version>
dependency>
// 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();
POST /index_name/
{
"size": 0,
"query": {
"bool": {
}
},
"aggregations": {
"uid_top": {
"top_hits": {
"sort": [{
"orderId": {
"order": "desc"
}
}],
"size": 1,
"_source": {
"includes": [
"orderId"
],
"excludes": []
}
}
}
}
}
{
"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": [
""
]
}
]
}
}
}
}
// :
AggregationBuilder aggregationBuilder = AggregationBuilders.terms("orderId_aggs").field("orderId").size(10000).subAggregation(AggregationBuilders.topHits("uid_top").addSort("offline_time", SortOrder.DESC).setSize(1));
{
"size": 100,
"query": {
" "
},
"collapse": {
"field": "orderId"
}
}
CollapseBuilder collapseBuilder = new CollapseBuilder("orderId");
SearchRequestBuilder requestBuilder = transportClient.prepareSearch("XXX").setTypes("XXX")
.setSize(111).setQuery(queryBuilder).setCollapse(collapseBuilder);
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
kafka connect e elasticsearch를 관찰할 수 있습니다.No menu lateral do dashboard tem a opção de connectors onde ele mostra todos os clusters do kafka connect conectados atu...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.