SearchV8SimpServiceImpl.java 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package com.winhc.phoenix.example.service.impl;
  2. import com.winhc.phoenix.example.dao.SearchDao;
  3. import com.winhc.phoenix.example.service.SearchService;
  4. import com.winhc.phoenix.example.util.SortUtil;
  5. import lombok.AllArgsConstructor;
  6. import lombok.extern.slf4j.Slf4j;
  7. import org.elasticsearch.common.lucene.search.function.CombineFunction;
  8. import org.elasticsearch.common.lucene.search.function.FiltersFunctionScoreQuery;
  9. import org.elasticsearch.index.query.BoolQueryBuilder;
  10. import org.elasticsearch.index.query.MultiMatchQueryBuilder;
  11. import org.elasticsearch.index.query.Operator;
  12. import org.elasticsearch.index.query.QueryBuilders;
  13. import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
  14. import org.elasticsearch.index.query.functionscore.ScriptScoreFunctionBuilder;
  15. import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
  16. import org.elasticsearch.search.sort.ScriptSortBuilder;
  17. import org.springframework.stereotype.Service;
  18. import static org.elasticsearch.index.query.QueryBuilders.*;
  19. /**
  20. * @author: XuJiakai
  21. * 2020/12/8 19:12
  22. */
  23. @Slf4j
  24. @Service(SearchV8SimpServiceImpl.index)
  25. @AllArgsConstructor
  26. public class SearchV8SimpServiceImpl implements SearchService {
  27. private SearchDao searchDao;
  28. public static final String index = "winhc-company-v8-simp";
  29. public static final String type = "company";
  30. private static final String[] includes_tips = new String[]{"cname.show","new_cid"};
  31. private static final FetchSourceContext fetchSourceContext_tips = new FetchSourceContext(true, includes_tips, null);
  32. @Override
  33. public Object tips(String s) {
  34. BoolQueryBuilder boolQuery = getBoolQuery(s);
  35. ScriptSortBuilder scriptSortBuilder = SortUtil.getInstance().fastSort;
  36. FunctionScoreQueryBuilder function = functionScoreQuery(boolQuery, new ScriptScoreFunctionBuilder(scriptSortBuilder.script())
  37. )
  38. .scoreMode(FiltersFunctionScoreQuery.ScoreMode.SUM)
  39. .boostMode(CombineFunction.MULTIPLY);
  40. Object search = searchDao.search(index, type, function, null, fetchSourceContext_tips, 0, 5);
  41. return search;
  42. }
  43. @Override
  44. public Object controlGroup(String s) {
  45. return searchDao.search(index, type, getBoolQuery(s), null, fetchSourceContext_tips, 0, 10);
  46. }
  47. @Override
  48. public Object query(String s, int from, int size) {
  49. BoolQueryBuilder boolQuery = getBoolQuery(s);
  50. ScriptSortBuilder scriptSortBuilder = SortUtil.getInstance().fastSort;
  51. FunctionScoreQueryBuilder function = functionScoreQuery(boolQuery, new ScriptScoreFunctionBuilder(scriptSortBuilder.script())
  52. )
  53. .boostMode(CombineFunction.MULTIPLY);
  54. Object search = searchDao.search(index, type, function, null, fetchSourceContext_tips, from, size);
  55. return search;
  56. }
  57. private BoolQueryBuilder getBoolQuery(String content) {
  58. BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
  59. MultiMatchQueryBuilder multiMatchQueryBuilder = multiMatchQuery(content)
  60. .operator(Operator.AND)
  61. .type(MultiMatchQueryBuilder.Type.CROSS_FIELDS)
  62. .minimumShouldMatch("5<80%")
  63. .tieBreaker(0.3F);
  64. boolQuery.should(termQuery("cname.value.keyword", content).boost(100));
  65. boolQuery.should(termQuery("history_name.value.keyword", content).boost(100));
  66. boolQuery.should(disMaxQuery().add(
  67. QueryBuilders.boolQuery()
  68. .should(termQuery("app_info.keyword", content).boost(40))
  69. .should(termQuery("company_tm.keyword", content).boost(20))
  70. ).tieBreaker(0.3F)
  71. );
  72. boolQuery.should(disMaxQuery().add(
  73. QueryBuilders.boolQuery()
  74. .should(matchQuery("app_info", content).boost(15))
  75. .should(matchQuery("company_tm", content).boost(5))
  76. .should(termQuery("app_info.keyword", content).boost(40))
  77. .should(termQuery("company_tm.keyword", content).boost(20))
  78. .minimumShouldMatch("5<80%")
  79. ).tieBreaker(0.4F)
  80. );
  81. multiMatchQueryBuilder
  82. .field("cname.value", 16)
  83. .field("history_name.value", 12)
  84. ;
  85. boolQuery.should(multiMatchQueryBuilder);
  86. BoolQueryBuilder boolQuery2 = QueryBuilders.boolQuery();
  87. boolQuery2.must(boolQuery);
  88. return boolQuery2;
  89. }
  90. }