ES有多种查询方式,我自己的业务是需要对多个字段进行查询,具体实现类代码如下。

 package com.cs99lzzs.elasticsearch.service.imp;

 import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map; import javax.annotation.Resource; import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.Client;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.StringTerms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms.Bucket;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.sort.SortBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.search.suggest.Suggest;
import org.elasticsearch.search.suggest.SuggestBuilder;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import com.alibaba.fastjson.JSON;
import com.cs99lzzs.elasticsearch.service.ProductSearchService;
import com.cs99lzzs.search.ElasticseachSku;
import com.cs99lzzs.search.EsProductQuery;
import com.cs99lzzs.search.EsResultingSku;
import com.cs99lzzs.search.vo.FacetVO;
import com.cs99lzzs.search.vo.SearchResultVO; @Service("productSearchService")
public class ProductSearchServiceImp implements ProductSearchService { private static Logger logger = Logger.getLogger(ProductSearchService.class); private static String aggrationBrandName = "brand_count"; private static String suggestZhName = "suggestName"; @Resource(name="esClient")
Client esClient; @Value("${elasticsearch.index}")
private String CLUSTER_INDEX; @Value("${elasticsearch.type}")
private String CLUSTER_TYPE; /**
* @return
*/
@SuppressWarnings("rawtypes")
@Override
public SearchResultVO get(EsProductQuery esProductQuery) {
if (esProductQuery == null ||
(StringUtils.isEmpty(esProductQuery.getKeyword())
&& StringUtils.isEmpty(esProductQuery.getCateName())
&& StringUtils.isEmpty(esProductQuery.getBrandName()))) {
return null;
}
//生成搜索条件
QueryBuilder boolQuery = generateBoolQuery(esProductQuery, null); //浅度分页,越到后面,反应越慢,还有可能导致es崩溃
SearchRequestBuilder srb = esClient.prepareSearch(CLUSTER_INDEX)
.setTypes(CLUSTER_TYPE)
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(boolQuery)
// .setPostFilter(QueryBuilders.rangeQuery("age").from(12).to(18))
.setExplain(true) //explain为true表示根据数据相关度排序,和关键字匹配最高的排在前面
.setFrom((esProductQuery.getPage() - 1) * esProductQuery.getPageSize())
.setSize(esProductQuery.getPageSize()); //获取排序规则
SortBuilder sortBuilder = getSortBuilder(esProductQuery);
if (sortBuilder != null) {
srb.addSort(sortBuilder);
} //按品牌名聚合
TermsAggregationBuilder termAgg = AggregationBuilders.terms(aggrationBrandName).field("brandName");
srb.addAggregation(termAgg); //执行搜索
SearchResponse actionGet = srb.execute().actionGet(); //深度分页,推荐实现
// SearchScrollRequestBuilder ssrb = esClient.prepareSearchScroll(actionGet.getScrollId())
// .setScroll(TimeValue.timeValueMinutes(8));
//获取查询结果,生成返回对象
List<EsResultingSku> skuList = new ArrayList<EsResultingSku>();
DecimalFormat priceFormat = new DecimalFormat("#0.00");
DecimalFormat discountFormat = new DecimalFormat("#0.0"); SearchHit[] hitArray = actionGet.getHits().getHits();
for (SearchHit searchHit : hitArray) {
ElasticseachSku eSku = JSON.parseObject(searchHit.getSourceAsString(), ElasticseachSku.class);
if (eSku != null) {
skuList.add(new EsResultingSku(eSku, discountFormat, priceFormat));
}
} SearchResultVO resultVO = new SearchResultVO();
resultVO.setSkus(skuList);
//总页数
long totalPage = actionGet.getHits().totalHits/esProductQuery.getPageSize();
if ((actionGet.getHits().totalHits % esProductQuery.getPageSize()) != 0) {
totalPage ++;
}
resultVO.setTotalPages(totalPage);
resultVO.setHits(actionGet.getHits().totalHits);
if (skuList.size() > 1) {
setFacetVOs(actionGet, resultVO);
} return resultVO;
}
/**
* @return
*/
@Override
public SearchResultVO get(String keyword, int page, int pageSize) {
if (StringUtils.isEmpty(keyword)) {
return null;
} //生成搜索条件
QueryBuilder boolQuery = generateBoolQuery(null, keyword); //浅度分页,越到后面,反应越慢,还有可能导致es崩溃
SearchRequestBuilder srb = esClient.prepareSearch(CLUSTER_INDEX)
.setTypes(CLUSTER_TYPE)
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(boolQuery)
// .setPostFilter(QueryBuilders.rangeQuery("age").from(12).to(18))
.setExplain(true) //explain为true表示根据数据相关度排序,和关键字匹配最高的排在前面
.setFrom((page - 1) * pageSize)
.setSize(pageSize); //按品牌名聚合
TermsAggregationBuilder termAgg = AggregationBuilders.terms(aggrationBrandName).field("brandName");
srb.addAggregation(termAgg); //执行搜索
SearchResponse actionGet = srb.execute().actionGet(); //深度分页,推荐实现
// SearchScrollRequestBuilder ssrb = esClient.prepareSearchScroll(actionGet.getScrollId())
// .setScroll(TimeValue.timeValueMinutes(8));
//获取查询结果,生成返回对象
List<EsResultingSku> skuList = new ArrayList<EsResultingSku>();
DecimalFormat priceFormat = new DecimalFormat("#0.00");
DecimalFormat discountFormat = new DecimalFormat("#0.0"); SearchHit[] hitArray = actionGet.getHits().getHits();
for (SearchHit searchHit : hitArray) {
ElasticseachSku eSku = JSON.parseObject(searchHit.getSourceAsString(), ElasticseachSku.class);
if (eSku != null) {
skuList.add(new EsResultingSku(eSku, discountFormat, priceFormat));
}
} SearchResultVO resultVO = new SearchResultVO();
resultVO.setSkus(skuList);
//总页数
long totalPage = actionGet.getHits().totalHits/pageSize;
if ((actionGet.getHits().totalHits % pageSize) != 0) {
totalPage ++;
}
resultVO.setTotalPages(totalPage);
resultVO.setHits(actionGet.getHits().totalHits); return resultVO;
} /**
* @param esProductQuery
* @param keyword
* @return
*/
private QueryBuilder generateBoolQuery(EsProductQuery esProductQuery, String key) { String keyword = null;
if (esProductQuery != null && esProductQuery.getKeyword() != null) {
keyword = QueryParser.escape(esProductQuery.getKeyword());
}
if (StringUtils.isNotEmpty(key)) {
keyword = QueryParser.escape(key);
} logger.info("filtered keyword is : " + keyword); //其他搜索条件
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
if (esProductQuery != null) {
if (esProductQuery.getIsDelete() == 1) {
boolQueryBuilder.must(QueryBuilders.termQuery("isDelete", true));
} else if (esProductQuery.getIsDelete() == -1) {
boolQueryBuilder.must(QueryBuilders.termQuery("isDelete", false));
}
if (esProductQuery.getSearchable() == 1) {
boolQueryBuilder.must(QueryBuilders.termQuery("searchable", true));
} else if (esProductQuery.getIsDelete() == -1) {
boolQueryBuilder.must(QueryBuilders.termQuery("searchable", false));
}
if (StringUtils.isNotEmpty(esProductQuery.getBrandName())) {
boolQueryBuilder.must(QueryBuilders.termQuery("brandName", QueryParser.escape(esProductQuery.getBrandName())));
}
if (StringUtils.isNotEmpty(esProductQuery.getCateName())) {
boolQueryBuilder.must(QueryBuilders.termQuery("cateName", QueryParser.escape(esProductQuery.getCateName())));
}
} else {
boolQueryBuilder.must(QueryBuilders.termQuery("isDelete", false));
boolQueryBuilder.must(QueryBuilders.termQuery("searchable", true));
} QueryBuilder multiMatchQuery = null;
if (StringUtils.isNotEmpty(keyword)) {
multiMatchQuery = QueryBuilders.multiMatchQuery(keyword,
"enName", "zhName","brandZhName", "brandEnName", "aliases", "brandAliases");
} if (multiMatchQuery == null) {
return boolQueryBuilder;
} else {
return boolQueryBuilder.must(multiMatchQuery);
}
}
/**
* @param sortByPrice
* @param sortByCommission
* @param sortBySalesVolume
* @return
*/
@SuppressWarnings("rawtypes")
private SortBuilder getSortBuilder(EsProductQuery esProductQuery) {
switch (esProductQuery.getSortByPrice()) {
case -1:
return SortBuilders.fieldSort("price").order(SortOrder.DESC);
case 1:
return SortBuilders.fieldSort("price").order(SortOrder.ASC);
default:
break;
} switch (esProductQuery.getSortByCommission()) {
case -1:
return SortBuilders.fieldSort("commission").order(SortOrder.DESC);
case 1:
return SortBuilders.fieldSort("commission").order(SortOrder.ASC);
default:
break;
} switch (esProductQuery.getSortByCommission()) {
case -1:
return SortBuilders.fieldSort("salesVolume").order(SortOrder.DESC);
case 1:
return SortBuilders.fieldSort("salesVolume").order(SortOrder.ASC);
default:
break;
}
return null;
} }

有什么问题我们可以好好讨论

Elasticsearch 5.4.3实战--Java API调用:搜索的更多相关文章

  1. Elasticsearch 5.4.3实战--Java API调用:索引mapping创建

    因为项目开发使用的是Java语言, 项目的开发架构是Spring MVC+ maven的jar包管理,  所以今天重点说说ES 5.4.3 的Java API的源码实战 1. pom.xml文件增加依 ...

  2. Elasticsearch 5.4.3实战--Java API调用:搜索建议

    通常的搜索引擎,都会根据用户的输入,实时给予匹配的提示. 那么这个功能在elasticsearch中如何实现呢? Elasticsearch里设计了4种类别的Suggester,分别是: Term S ...

  3. Elasticsearch 5.4.3实战--Java API调用:批量写入数据

    这个其实比较简单,直接上代码. 注意部分逻辑可以换成你自己的逻辑 package com.cs99lzzs.elasticsearch.service.imp; import java.sql.Tim ...

  4. Elasticsearch java api 基本搜索部分详解

    文档是结合几个博客整理出来的,内容大部分为转载内容.在使用过程中,对一些疑问点进行了整理与解析. Elasticsearch java api 基本搜索部分详解 ElasticSearch 常用的查询 ...

  5. elasticsearch(一):JAVA api操作

    1.创建一个mavan项目,项目的以来配置如下. <?xml version="1.0" encoding="UTF-8"?> <projec ...

  6. ElasticSearch入门-增删改查(java api)

    1.增加Index PutMappingRequest mapping = Requests.putMappingRequest(indices).type(mappingType).source(g ...

  7. JAVA Api 调用Hbase报错锦集

    1. 报错 java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/protobuf/generated/MasterProtos$Master ...

  8. java api 调用es集群(1.7版本)

    public static void main(String[] args) { Settings settings = ImmutableSettings.settingsBuilder() // ...

  9. Zookeeper Java API调用

    引入zookeeper-3.4.11.jar public class ZooKeeperTest implements Watcher{ //public final static String z ...

随机推荐

  1. Java基础super关键字、final关键字、static关键字、匿名对象整理

    super关键字 10.1子父类中构造方法的调用 public class Test { public static void main(String[] args) { new Zi(); } } ...

  2. go vendor管理Golang项目依赖

    解决的问题 将源码拷贝到当前工程的vendor目录下,这样打包当前的工程代码到任意机器的$GOPATH/src下都可以通过编译. govendor 1.安装 go get -u -v github.c ...

  3. Rancher之Pipeline JAVA demo

    Rancher Pipeline Pipeline,简单来说,就是一套运行于Rancher上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程. Ranc ...

  4. HDU 6375(双端队列 ~)

    题意是有至多150000个双端队列,400000次简单操作,直接开会导致内存超限,所以用 STL 中的 map 和 deque ,而读入过大已经在题目中有所说明,直接用已经给出的快速读入即可.要注意的 ...

  5. HTML第二耍 列表标签

    先复习下上一节 <!doctype html> <html> <head> <meta charset="utf-8"> <t ...

  6. mysql引擎,完整的见表语句,数据库模式, 常用数据类型,约束条件

    引擎 show engines : 查看引擎 innodb(默认引擎):支持事务,行级锁,外键 myisam:查询效率由于innodb,不需要支持事务,行级锁,外键,可以选用myisam来优化数据库 ...

  7. JDK源码之数组

    序言 <1>栈内存和堆内存当一个方法执行时,每个方法都会建立自己的内存栈,在这方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁.所有在方法中定义的 ...

  8. you have mixed tabs and spaces.Fix This屏蔽

    这个功能很影响vs的速度,解决办法(VS2010版本为例),将Fix Mixed Tabs改为OFF即可.

  9. C#一例绘制字体不清晰的解决办法

    public static Bitmap GetPieWithText(String text, Color color, Color fontColor,Font font) { ; Bitmap ...

  10. HttpService

    // // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler ...