elasticsearch5.4.0 java开发记录四

本篇主要用来介绍下接单查询:

获取执行查询的API

获取elasticsearch 客户端:第一篇中已讲述,下面是java代码:

1,简单查询

TermQueryBuilder query = QueryBuilders.termQuery(ProductInfoEnum.PRODUCTSN.getName(), productSn); 第一个参数是 索引中字段名变量,第二个字段是你要进行查询的值变量

2,组合查询

BoolQueryBuilder snBooleanQuery = QueryBuilders.boolQuery(); 获得组合查询

snBooleanQuery.should(query);//组合查询中 或的关系,相当于OR

snBooleanQuery.must(query);//组合查询中并且的关系,相当于 AND

3,区间查询

RangeQueryBuilder priceQuery = QueryBuilders.rangeQuery(ProductInfoEnum.SHOWPRICE.getName()) .gte(priceStart).lte(priceEnd);

第一个变量是索引中字段名称,gte()是大于等于,ite()是小于等于 多数用来 数字,价格,时间区间进行查询;

4,进行查询

SearchRequestBuilder searchRequestBuilder = this.client.prepareSearch(INDEX_NAME).setTypes(TYPE_NAME);

response = searchRequestBuilder

                     .setQuery(booleanQuery)  //设置查询语句

                    .setFrom(0)  //设置从哪里开始
                    .setSize(10000) //设置查询多少

                    .setTimeout(TimeValue.timeValueSeconds(30)) //设置查询超时时间
                    .get(); //执行查询

5,获取结果

           SearchHits hits = response.getHits();
		long total = hits.getTotalHits();

		resultMap.put("total", total);
		LOGGER.info("进行查询query:【{}】,共【{}】条,共耗时:【{}】ms", booleanQuery, total,
				response.getTook().getMillis());

		for (SearchHit hit : hits) {
			ProductInfoVO vo = new ProductInfoVO();
			// System.out.println("得分:" + hit.getScore());
			JSONObject json = new JSONObject(hit.getSourceAsMap());
			vo = JSON.toJavaObject(json, ProductInfoVO.class);
			lists.add(vo);
		}
------------------------------------------------------分割线-----------------------------------------------------------------------

以上是比较简单的查询

关键字查询:

if (StringUtils.isNotBlank(queryVo.getKeyWords())) {
            String key = queryVo.getKeyWords();

            BoolQueryBuilder vendorBooleanQuery = QueryBuilders.boolQuery();
            MultiMatchQueryBuilder query = QueryBuilders.multiMatchQuery(key,
                    ProductInfoEnum.BRANDCHNAME.getName(),
                    ProductInfoEnum.BRANDENNAME.getName(),
                    ProductInfoEnum.PRODUCTKEYWORDS.getName(),
                    ProductInfoEnum.PRODUCTNAME.getName(),
                    ProductInfoEnum.PRODUCTSN.getName());
            vendorBooleanQuery.should(query);

设置排序

FieldSortBuilder sortQuery = SortBuilders.fieldSort(
                FieldSortEnum.PRICE.getFieldName()).order(SortOrder.DESC);

 高亮 商品名称
        HighlightBuilder highlightBuilder = new HighlightBuilder()
                .preTags("<span style=\"color:red\">").postTags("</span>")
                .field(ProductInfoEnum.PRODUCTNAME.getName());

分组
      TermsAggregationBuilder tabBrand = AggregationBuilders.terms("brand")
                .field(ProductInfoEnum.BRANDCODENAME.getName()).size(1000);

查询

SearchRequestBuilder requestBuilder = searchRequestBuilder
                .addSort(sortQuery)

                .setFrom(from)

                .setSize(size)
                .setQuery(booleanQuery)

                .highlighter(highlightBuilder)
                .addAggregation(tabBrand)

                .addAggregation(tabVendor)
                .addAggregation(firstClass);

                .setTimeout(TimeValue.timeValueSeconds(30))

                .get();


获取高亮结果
    

 for (SearchHit hit : hits) {
            ProductInfoVO vo = new ProductInfoVO();
            System.out.println("得分:" + hit.getScore());

            Map<String, Object> highMap = hit.getSourceAsMap();

            HighlightField hightfield = hit.getHighlightFields().get(
                    ProductInfoEnum.PRODUCTNAME.getName());
            if (hightfield != null) {
                Text[] fragments = hightfield.fragments();
                StringBuffer sbf = new StringBuffer();
                for (Text t : fragments) {
                    sbf = sbf.append(t);
                }
                highMap.put(ProductInfoEnum.PRODUCTNAME.getName(),
                        sbf.toString());
            }

            JSONObject json = new JSONObject(highMap);

            vo = JSON.toJavaObject(json, ProductInfoVO.class);
            lists.add(vo);
        }
简单聚合结果:

Map<String, Aggregation> aggMap = response.getAggregations().asMap();

		Set<String> strKeys = aggMap.keySet();

		Iterator<String> ite = strKeys.iterator();

		while (ite.hasNext()) {
			String key = ite.next();
			StringTerms teamAgg = (StringTerms) aggMap.get(key);
			LOGGER.info(key + "聚合后有:" + teamAgg.getBuckets().size());
			Iterator<Bucket> teamBucketIt = teamAgg.getBuckets().iterator();
			List<FilterBean> filterBeans = new ArrayList<FilterBean>();
			while (teamBucketIt.hasNext()) {
				Bucket buck = teamBucketIt.next();
				String codeName = (String) buck.getKey();
				if (StringUtils.isNotBlank(codeName)) {
					String[] strs = codeName.split("\\_");
					long count = buck.getDocCount();
					if (strs.length > 1) {
					   FilterBean fb = new FilterBean(count, strs[0], strs[1],);
					   filterBeans.add(fb);
					}
				}
			}
			resultMap.put(key, filterBeans);
		}
此部分旧完了,如有错误,不足之处,望指正,多谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值