package com.winhc.phoenix.example.service.impl; import com.winhc.phoenix.example.dao.SearchDao; import com.winhc.phoenix.example.service.SearchService; import com.winhc.phoenix.example.util.SortUtil; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.elasticsearch.common.lucene.search.function.CombineFunction; import org.elasticsearch.common.lucene.search.function.FiltersFunctionScoreQuery; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.MultiMatchQueryBuilder; import org.elasticsearch.index.query.Operator; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder; import org.elasticsearch.index.query.functionscore.ScriptScoreFunctionBuilder; import org.elasticsearch.search.fetch.subphase.FetchSourceContext; import org.elasticsearch.search.sort.ScriptSortBuilder; import org.springframework.stereotype.Service; import static org.elasticsearch.index.query.QueryBuilders.*; /** * @author: XuJiakai * 2020/12/8 19:12 */ @Slf4j @Service(SearchV8SimpServiceImpl.index) @AllArgsConstructor public class SearchV8SimpServiceImpl implements SearchService { private SearchDao searchDao; public static final String index = "winhc-company-v8-simp"; public static final String type = "company"; private static final String[] includes_tips = new String[]{"cname.show","new_cid"}; private static final FetchSourceContext fetchSourceContext_tips = new FetchSourceContext(true, includes_tips, null); @Override public Object tips(String s) { BoolQueryBuilder boolQuery = getBoolQuery(s); ScriptSortBuilder scriptSortBuilder = SortUtil.getInstance().fastSort; FunctionScoreQueryBuilder function = functionScoreQuery(boolQuery, new ScriptScoreFunctionBuilder(scriptSortBuilder.script()) ) .scoreMode(FiltersFunctionScoreQuery.ScoreMode.SUM) .boostMode(CombineFunction.MULTIPLY); Object search = searchDao.search(index, type, function, null, fetchSourceContext_tips, 0, 5); return search; } @Override public Object controlGroup(String s) { return searchDao.search(index, type, getBoolQuery(s), null, fetchSourceContext_tips, 0, 10); } @Override public Object query(String s, int from, int size) { BoolQueryBuilder boolQuery = getBoolQuery(s); ScriptSortBuilder scriptSortBuilder = SortUtil.getInstance().fastSort; FunctionScoreQueryBuilder function = functionScoreQuery(boolQuery, new ScriptScoreFunctionBuilder(scriptSortBuilder.script()) ) .boostMode(CombineFunction.MULTIPLY); Object search = searchDao.search(index, type, function, null, fetchSourceContext_tips, from, size); return search; } private BoolQueryBuilder getBoolQuery(String content) { BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); MultiMatchQueryBuilder multiMatchQueryBuilder = multiMatchQuery(content) .operator(Operator.AND) .type(MultiMatchQueryBuilder.Type.CROSS_FIELDS) .minimumShouldMatch("5<80%") .tieBreaker(0.3F); boolQuery.should(termQuery("cname.value.keyword", content).boost(100)); boolQuery.should(termQuery("history_name.value.keyword", content).boost(100)); boolQuery.should(disMaxQuery().add( QueryBuilders.boolQuery() .should(termQuery("app_info.keyword", content).boost(40)) .should(termQuery("company_tm.keyword", content).boost(20)) ).tieBreaker(0.3F) ); boolQuery.should(disMaxQuery().add( QueryBuilders.boolQuery() .should(matchQuery("app_info", content).boost(15)) .should(matchQuery("company_tm", content).boost(5)) .should(termQuery("app_info.keyword", content).boost(40)) .should(termQuery("company_tm.keyword", content).boost(20)) .minimumShouldMatch("5<80%") ).tieBreaker(0.4F) ); multiMatchQueryBuilder .field("cname.value", 16) .field("history_name.value", 12) ; boolQuery.should(multiMatchQueryBuilder); BoolQueryBuilder boolQuery2 = QueryBuilders.boolQuery(); boolQuery2.must(boolQuery); return boolQuery2; } }