本篇主要用来介绍下接单查询:
获取执行查询的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);
}
此部分旧完了,如有错误,不足之处,望指正,多谢。