elasticsearch分组查询,按相关度降序排列,例子为取价格最大

{
  "query": {
    "match": {
      "productName": {
        "query": "牛奶"
      }
    }
  },
  "aggs": {
    "shopIdagg": {
      "terms": {
        "field": "productId",
        "order": {
          "top_hit": "desc"
        }
      },
      "aggs": {
        "maxP": {
          "max": {
            "field": "salesPrice"
          }
        },
        "top_test": {
          "top_hits": {
            "sort": {
              "_score": "desc",
              "salesPrice": "desc"
            }
          }
        },
        "top_hit": {
          "max": {
            "script": "_score"
          }
        }
      }
    }
  }
}

        Java客户端代码为:

int currentPage = 2;
	int pageSize = 10;
	int count = currentPage * pageSize;
	
	try {
		Client client = EsCollectionIk.getCollectionForIk(index);
		
		TermsBuilder placeProductGroup = AggregationBuilders.terms("placeProduct_group").field("productId").size(count);
		Order top_hit_order = Order.aggregation("top_hit", false);
		placeProductGroup.order(Order.compound(top_hit_order));
		
		XContentBuilder maxPriceJsonBuilder = XContentFactory.jsonBuilder()
				.startObject()
					.startObject("max_price")
						.startObject("max").field("field", "salesPrice").endObject()
					.endObject()
					.startObject("top_test")
						.startObject("top_hits")
							.startObject("sort")
								.field("_score", "desc")
								.field("salesPrice", "desc")
							.endObject()
							.field("size", 1).endObject()
					.endObject()
					.startObject("top_hit").startObject("max").field("script", "_score").endObject().endObject()
				.endObject();
		maxPriceJsonBuilder.string();
		placeProductGroup.subAggregation(maxPriceJsonBuilder);
		
		SearchRequestBuilder builder = client.prepareSearch(index)
				.setTypes(EsCollectionIk.analyzerType)
				.setFrom(0).setSize(10)
				.setQuery(QueryBuilders.matchQuery("productName", "牛奶"))
				.addAggregation(placeProductGroup);
		
		SearchResponse resp = builder.execute().actionGet();
		SearchHits sHits = resp.getHits();
		SearchHit[] hits = sHits.getHits();
		float time = resp.getTookInMillis() / 1000f;
		System.out.println("找到约 " + sHits.getTotalHits() + " 条结果 (用时" + time + "秒) ");
		System.out.println("resp: ");
		System.out.println(resp);
		System.out.println();
		StringTerms outAggre = resp.getAggregations().get("placeProduct_group");
		List<Bucket> buckets = outAggre.getBuckets();
		System.out.println("hits: " + hits.length + "; buckets: " + buckets.size());
		System.out.println("");
		//搜索结果, 对分组无用
		/*for (SearchHit hit : hits) {
			Map<String, Object> source = hit.getSource();
			System.out.println("source: " + source);
		}*/
		System.out.println("");
		int begin = pageSize * (currentPage - 1);
		int end = Math.min(begin + pageSize, buckets.size());
		for (int i = begin; i < end; i++) {
			//InternalMax maxPrice = aggre.get("max_price");
			//String maxSalesPrice = maxPrice.getValueAsString();
			Bucket bucket = buckets.get(i);
			Aggregations aggre = bucket.getAggregations();
			InternalTopHits topHits = aggre.get("top_test");
			SearchHits searchHits = topHits.getHits();
			for (SearchHit shit : searchHits) {
				Map<String, Object> source = shit.getSource();
				//String hitSalesPrice = String.valueOf(source.get("salesPrice"));
				//System.out.println("maxSalesPrice: " + maxSalesPrice + "; hitSalesPrice: " + hitSalesPrice);
				System.out.println("分组查询结果: " + source);
				break;
			}
		}
	} catch (IOException e) {
		e.printStackTrace();
	}
}

    留着有时间好好看看。

你可能感兴趣的:(elasticsearch分组查询,按相关度降序排列,例子为取价格最大)