java接口补全_Elasticsearch--java API(自动提示补全)亲测

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;

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值