Elasticsearch-自定义评分+折叠Java实现
Elasticsearch自定义评分+折叠Java实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | QueryBuilder boolQueryBuilder = query.getBoolQueryBuilder(localInfoRequest, QueryEnum.termsQuery); FunctionScoreQueryBuilder.FilterFunctionBuilder[] filterFunctionBuilders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[ 3 ]; ScoreFunctionBuilder score = new FieldValueFactorFunctionBuilder( "type" ).factor( 1 .0f); filterFunctionBuilders[ 0 ] = new FunctionScoreQueryBuilder.FilterFunctionBuilder(score); ScoreFunctionBuilder score1 = new FieldValueFactorFunctionBuilder( "clipId" ).factor( 1 .0f); filterFunctionBuilders[ 1 ] = new FunctionScoreQueryBuilder.FilterFunctionBuilder(score1); ScoreFunctionBuilder score2 = new FieldValueFactorFunctionBuilder( "partnerId" ).factor( 1 .0f); filterFunctionBuilders[ 2 ] = new FunctionScoreQueryBuilder.FilterFunctionBuilder(score2); FunctionScoreQueryBuilder functionScoreQuery = QueryBuilders.functionScoreQuery(boolQueryBuilder, filterFunctionBuilders) .scoreMode(FunctionScoreQuery.ScoreMode.SUM) .boostMode(CombineFunction.SUM); System.out.println(functionScoreQuery); CollapseBuilder collapse = new CollapseBuilder( "partnerId" ); InnerHitBuilder innerHit = new InnerHitBuilder(); innerHit.setName( "collapse" ); innerHit.setFrom( 0 ); innerHit.setSize( 1 ); innerHit.setTrackScores( true ); innerHit.setIgnoreUnmapped( true ); innerHit.addSort(SortBuilders.fieldSort( "serviceId" ).order(SortOrder.DESC)).addSort(SortBuilders.geoDistanceSort( "point" , 30.223 ,- 70.334 )); collapse.setInnerHits(innerHit); SearchSourceBuilder builder = new SearchSourceBuilder() .query(functionScoreQuery) .collapse(collapse) .from( 0 ) .size( 10 ) .sort(SortBuilders.fieldSort( "type" ).order(SortOrder.DESC)) .sort(SortBuilders.fieldSort( "partnerId" ).order(SortOrder.DESC)); System.out.println(builder); SearchRequest request = new SearchRequest(IndexEnum.LocalInfo.getIndex()) .source(builder) .searchType(SearchType.QUERY_THEN_FETCH); SearchResponse response = client.search(request, RequestOptions.DEFAULT); SearchHit[] hits = response.getHits().getHits(); for (SearchHit hit : hits) { System.out.println( "Hits" ); System.out.println(hit.getId()); for (SearchHits inner : hit.getInnerHits().values()) { System.out.println( "InnerHits" ); for (SearchHit innerCollapse : inner.getHits()) { System.out.println(innerCollapse.getId()); } } } Map<String, SearchHits> innerHits = hits[ 0 ].getInnerHits(); Optional<SearchHits> first = innerHits.values().stream().findFirst(); LocalInfo localInfo = JsonUtil.transFormationMap(first.get().getHits()[ 0 ].getSourceAsString(), LocalInfo. class ); System.out.println(JsonUtil.transFormationJson(localInfo)); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端