packagees;importjava.util.ArrayList;importjava.util.List;importjava.util.Map;importorg.apache.commons.lang3.StringUtils;importorg.elasticsearch.action.search.SearchRequestBuilder;importorg.elasticsearch.action.search.SearchResponse;importorg.elasticsearch.action.search.SearchType;importorg.elasticsearch.client.Client;importorg.elasticsearch.common.unit.TimeValue;importorg.elasticsearch.index.query.BoolQueryBuilder;importorg.elasticsearch.index.query.DisMaxQueryBuilder;importorg.elasticsearch.index.query.QueryBuilder;importorg.elasticsearch.index.query.QueryBuilders;importorg.elasticsearch.index.query.TermQueryBuilder;importorg.elasticsearch.search.SearchHit;importorg.elasticsearch.search.SearchHits;importorg.elasticsearch.search.sort.SortBuilder;importorg.elasticsearch.search.sort.SortBuilders;importorg.elasticsearch.search.sort.SortOrder;importcom.alibaba.fastjson.JSONObject;public classdoSuggest {/*** 做自动补全
*@paramindex 索引
*@paramtype1 类型1
*@paramtype2 类型2
*@paramsize 大小
*@paramqueryStr 查询语句
*@paramcityCode 城市代码
*@return
*/
publicString doSuggest(String index, String type1, String type2, Integer size, String key,Integer cityCode) {if(StringUtils.isBlank(key)){return null;
}
key=key.toLowerCase();
List> result = new ArrayList>();
ClientHelper clientHelper= newClientHelper();
Client client=clientHelper.getClient();//先查询区域,区域优先
SearchRequestBuilder searchRequestBuilder1 =client.prepareSearch(index).setTypes(type1).setSearchType(SearchType.DFS_QUERY_THEN_FETCH);if (size == null || size <= 0)
size= 10;
DisMaxQueryBuilder disMaxQueryBuilder=QueryBuilders.disMaxQuery();
TermQueryBuilder name= QueryBuilders.termQuery("districtName", key);
TermQueryBuilder fpy= QueryBuilders.termQuery("fpy", key);
TermQueryBuilder spy=QueryBuilders.termQuery("spy", key);
disMaxQueryBuilder.add(name);
disMaxQueryBuilder.add(fpy);
disMaxQueryBuilder.add(spy);
SortBuilder sortBuilder= SortBuilders.fieldSort("num").order(SortOrder.DESC) ;
SortBuilder spySort= SortBuilders.fieldSort("districtCode").order(SortOrder.ASC);
QueryBuilder fileter= null;if(cityCode != null){
fileter= QueryBuilders.termQuery("cityCode", cityCode);
}
SearchResponse response=searchRequestBuilder1.setQuery(disMaxQueryBuilder).setPostFilter(fileter).addSort(sortBuilder).addSort(spySort).setSize(size)
.setTimeout(TimeValue.timeValueMinutes(2)).execute().actionGet();
SearchHits hits=response.getHits();if (hits.getTotalHits() > 0) {for(SearchHit hit : hits) {
Map source =hit.getSource();
source.put("id", hit.getId());
source.put("index", hit.getIndex());
source.put("resultType","district");
result.add(source);
}
size= size -Long.valueOf(hits.getTotalHits()).intValue();if(size>0){//开始搜索区域和名称里面都带有该字符的信息
DisMaxQueryBuilder qyDisMaxQueryBuilder =QueryBuilders.disMaxQuery();
TermQueryBuilder qyname= QueryBuilders.termQuery("districtName", key);
TermQueryBuilder qyfpy= QueryBuilders.termQuery("districtNameFPY", key);
TermQueryBuilder qyspy=QueryBuilders.termQuery("districtNameSPY", key);
qyDisMaxQueryBuilder.add(qyname);
qyDisMaxQueryBuilder.add(qyfpy);
qyDisMaxQueryBuilder.add(qyspy);
DisMaxQueryBuilder nameDisMaxQueryBuilder=QueryBuilders.disMaxQuery();
TermQueryBuilder stageNamesTerm= QueryBuilders.termQuery("stageNames", key);
TermQueryBuilder stagefpy= QueryBuilders.termQuery("fpy", key);
TermQueryBuilder stagespy= QueryBuilders.termQuery("spy", key);
nameDisMaxQueryBuilder.add(stageNamesTerm);
nameDisMaxQueryBuilder.add(stagefpy);
nameDisMaxQueryBuilder.add(stagespy);
Client client2=clientHelper.getClient();
BoolQueryBuilder query=QueryBuilders.boolQuery().must(qyDisMaxQueryBuilder).must(nameDisMaxQueryBuilder);
SortBuilder sortBuilder2= SortBuilders.fieldSort("sortNum").order(SortOrder.DESC) ;
QueryBuilder fileter2= null;if(cityCode != null){
fileter2= QueryBuilders.termQuery("cityCode", cityCode);
}//先查询区域,区域优先
SearchRequestBuilder searchRequestBuilder2 =client2.prepareSearch(index).setTypes(type2).setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
SearchResponse response2=searchRequestBuilder2.setQuery(query).setPostFilter(fileter2).addSort(sortBuilder2).setSize(size)
.setTimeout(TimeValue.timeValueMinutes(2)).execute().actionGet() ;
SearchHits hits2=response2.getHits();if(hits2.getTotalHits()>0){for(SearchHit hit : hits2){
Map source =hit.getSource();
source.put("id", hit.getId());
source.put("index", hit.getIndex());
source.put("hitDistrict","true");
source.put("resultType","stage");
result.add(source);
}
size= size -Long.valueOf(hits2.getTotalHits()).intValue();
}
}if(size>0){
SearchHits hits3= searchData(client, index, type2, 10, key,cityCode);if(hits3.getTotalHits()>0){for(SearchHit hit : hits3) {if(size<=0){break;
}
String id=hit.getId();boolean exists =false;if(result!=null&&result.size()>0){for(Mapex : result){
String exId= (String)ex.get("id");if(id.equals(exId)){
exists= true;break;
}
}
}if(!exists){
Map source =hit.getSource();
source.put("id", hit.getId());
source.put("index", hit.getIndex());
source.put("hitDistrict","false");
source.put("resultType","stage");
result.add(source);
size--;
}
}
}
}
}else{
SearchHits hits2=searchData(client, index, type2, size, key,cityCode);if(hits2.getTotalHits()>0){for(SearchHit hit : hits2) {
Map source =hit.getSource();
source.put("id", hit.getId());
source.put("index", hit.getIndex());
source.put("hitDistrict","false");
source.put("resultType","stage");
result.add(source);
}
}
}returnJSONObject.toJSONString(result);
}privateSearchHits searchData(Client client,String index,String type,Integer size,String key,Integer cityCode){//再检索楼盘类型中的数据
SearchRequestBuilder searchRequestBuilder =client.prepareSearch(index).setTypes(type).setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
DisMaxQueryBuilder disMaxQueryBuilder=QueryBuilders.disMaxQuery();
TermQueryBuilder stageNamesTerm=QueryBuilders.termQuery("stageNames", key);
TermQueryBuilder fpyTerm=QueryBuilders.termQuery("fpy", key);
TermQueryBuilder spyTerm=QueryBuilders.termQuery("spy", key);
disMaxQueryBuilder.add(stageNamesTerm);
disMaxQueryBuilder.add(fpyTerm);
disMaxQueryBuilder.add(spyTerm);
SortBuilder sortBuilder= SortBuilders.fieldSort("sortNum").order(SortOrder.DESC) ;
QueryBuilder fileter= null;if(cityCode != null){
fileter= QueryBuilders.termQuery("cityCode", cityCode);
}
SearchResponse response=searchRequestBuilder.setQuery(disMaxQueryBuilder).setPostFilter(fileter).addSort(sortBuilder).setSize(size)
.setTimeout(TimeValue.timeValueMinutes(2)).execute().actionGet();
SearchHits hits=response.getHits();returnhits;
}
}