现实项目中不一样的《建造者模式》

打印 上一主题 下一主题

主题 1005|帖子 1005|积分 3015

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
builder真的是为了创建复杂的对象而产生的,现实使用场景更侧重复杂对象的构建。
记录一下ES检索复杂对象场景的使用:
首先是抽象层的builder
点击检察代码
  1. //构建查询where 条件
  2.     interface BuildWhere {
  3.         QueryBuilder build();
  4.         public static void setDelWhere(final BoolQueryBuilder boolQueryBuilder){
  5.             boolQueryBuilder.must(QueryBuilders.termQuery("isDel",0));
  6.             boolQueryBuilder.must(QueryBuilders.termQuery("isImageExist",true));
  7.         }
  8.     }
复制代码
再看builder实现
点击检察代码
  1.     class SearchQueryBuilder{
  2.         private SearchQueryVo searchQueryVo;
  3.         private SearchRequest searchRequest;
  4.         public SearchQueryBuilder(final SearchQueryVo searchQueryVo,final ElasticSearchIndexEnum indexEnum) {
  5.             this.searchQueryVo = searchQueryVo;
  6.             //指定查询的index
  7.             searchRequest = new SearchRequest(indexEnum.getValue());
  8.         }
  9.         public String build(){
  10.             SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  11.             //查询条件 where
  12.             BuildWhere strategy = strategy(searchQueryVo.getSearchTypeEnum());
  13.             searchSourceBuilder.query(strategy.build());
  14.             //分页limit
  15.             searchSourceBuilder.from((searchQueryVo.getCurPage()-1)*searchQueryVo.getPageSize());
  16.             searchSourceBuilder.size(searchQueryVo.getPageSize());
  17.             /**
  18.              * 排序
  19.              * 如果是简单查询条件为空时,则按照inputTime desc
  20.              * 其他则按照得分 desc
  21.              * change:所有查询结果加入排序,时间排序
  22.              */
  23.             String order = searchQueryVo.getOrder();
  24.             if (StringUtils.isNotBlank(order)) {
  25.                 if (order.equals(SortOrder.DESC.toString())) {
  26.                     searchSourceBuilder.sort(new FieldSortBuilder("inputTime").order(SortOrder.DESC));
  27.                 }else if (order.equals(SortOrder.ASC.toString())){
  28.                     searchSourceBuilder.sort(new FieldSortBuilder("inputTime").order(SortOrder.ASC));
  29.                 }
  30.             }
  31.             searchSourceBuilder.sort(new ScoreSortBuilder().order(SortOrder.DESC));
  32.             //预处理prepare
  33.             searchRequest.source(searchSourceBuilder);
  34.             String searchString = searchService.getSearchString(searchRequest);
  35.             log.debug("searchString :{}", searchString);
  36.             return searchString;
  37.         }
  38.         /**
  39.          * 自动选择查询类型
  40.          * @param searchTypeEnum
  41.          * @return
  42.          */
  43.         private BuildWhere strategy(SearchTypeEnum searchTypeEnum){
  44.             BuildWhere buildWhere = null;
  45.             switch (searchTypeEnum){
  46.                 case simple:
  47.                     buildWhere = new SimpleBuild();
  48.                     break;
  49.                 case height:
  50.                     buildWhere=new HeightBuild();
  51.                     break;
  52.                 case insearch:
  53.                     buildWhere=new TwiceSearchBuild();
  54.                     break;
  55.                 default:
  56.                     log.error("not found search type of {}",searchTypeEnum);
  57.             }
  58.             return buildWhere;
  59.         }
  60.         /**
  61.          * 默认创建第一次查询的条件
  62.          * @return
  63.          */
  64.         private BoolQueryBuilder createBoolQueryBuilder(){
  65.             return createBoolQueryBuilder(searchQueryVo.getOnceSearchVo());
  66.         }
  67.         /**
  68.          * 构建一个boolQuery
  69.          * @return
  70.          */
  71.         private BoolQueryBuilder createBoolQueryBuilder(SearchQueryVo.SearchVo searchVo){
  72.             BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  73.             if (searchVo == null) {
  74.                 return boolQueryBuilder;
  75.             }
  76.             //title(可能出现在多个字段中,这里为了防止可能出现其他字段,用multiMatch)
  77.             String title = searchVo.getTitle();
  78.             if (StringUtils.isNotBlank(title)) {
  79.                 boolQueryBuilder.must(QueryBuilders.multiMatchQuery(title,"headline").analyzer("ik_smart"));
  80.             }
  81.             //图片元素标签
  82.             List<String> elementLabel = searchVo.getElementLabel();
  83.             if (CollectionUtils.isNotEmpty(elementLabel)) {
  84.                 //图片元素标签在量字段中查询
  85.                 BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
  86.                 boolQuery.should((QueryBuilders.termsQuery("imageScenes.name",elementLabel)));
  87.                 boolQuery.should((QueryBuilders.termsQuery("imageItems.name",elementLabel)));
  88.                 boolQueryBuilder.filter(boolQuery);
  89.             }
  90.             //图片来源
  91.             List<String> imageSource = searchVo.getImageSource();
  92.             if (CollectionUtils.isNotEmpty(imageSource)) {
  93.                 boolQueryBuilder.filter(QueryBuilders.termsQuery("imageSource",imageSource));
  94.             }
  95.             //作者
  96.             List<String> newsGrapherName = searchVo.getNewsGrapherName();
  97.             if (CollectionUtils.isNotEmpty(newsGrapherName)) {
  98.                 boolQueryBuilder.filter(QueryBuilders.termsQuery("newsGrapherName",newsGrapherName));
  99.             }
  100.             //关键词
  101.             String keywords = searchVo.getKeywords();
  102.             if (StringUtils.isNotBlank(keywords)) {
  103.                 boolQueryBuilder.must(QueryBuilders.multiMatchQuery(keywords,"caption","headline","searchKey").analyzer("ik_smart"));
  104.             }
  105.             //开始时间
  106.             String imageTimeStart = searchVo.getImageTimeStart();
  107.             if (StringUtils.isNotBlank(imageTimeStart)) {
  108.                 boolQueryBuilder.filter(QueryBuilders.rangeQuery("imageTime").gte(imageTimeStart));
  109.             }
  110.             //结束时间
  111.             String imageTimeEnd = searchVo.getImageTimeEnd();
  112.             if (StringUtils.isNotBlank(imageTimeEnd)) {
  113.                 boolQueryBuilder.filter(QueryBuilders.rangeQuery("imageTime").lte(imageTimeEnd));
  114.             }
  115.             return boolQueryBuilder;
  116.         }
  117.         /**
  118.          * 简单检索
  119.          */
  120.         private class SimpleBuild implements BuildWhere {
  121.             /**
  122.              * 如果简单查询没有任何条件限制,则返回列表按照时间DESC
  123.              * @return
  124.              */
  125.             public QueryBuilder build() {
  126.                 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  127.                 String titleOrKeywordOrTag = searchQueryVo.getTitleOrKeywordOrTag();
  128.                 if (StringUtils.isNotBlank(titleOrKeywordOrTag)) {
  129.                     MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(searchQueryVo.getTitleOrKeywordOrTag(), filedNames).analyzer("ik_smart");
  130.                     boolQueryBuilder.must(multiMatchQueryBuilder);
  131.                 }
  132.                 BuildWhere.setDelWhere(boolQueryBuilder);
  133.                 return boolQueryBuilder;
  134.             }
  135.         }
  136.         /**
  137.          * 高级检索
  138.          */
  139.         private class HeightBuild implements BuildWhere {
  140.             public QueryBuilder build() {
  141.                 BoolQueryBuilder boolQueryBuilder = createBoolQueryBuilder();
  142.                 BuildWhere.setDelWhere(boolQueryBuilder);
  143.                 return boolQueryBuilder;
  144.             }
  145.         }
  146.         /**
  147.          * 结果中检索
  148.          */
  149.         private class TwiceSearchBuild implements BuildWhere {
  150.             public QueryBuilder build() {
  151.                 //构建第一次查询(最外层条件)
  152.                 BoolQueryBuilder outBoolQueryBuilder = createBoolQueryBuilder();
  153.                 //结果中二次筛选查询(第二层条件)
  154.                 BoolQueryBuilder in1BoolQueryBuilder = createBoolQueryBuilder(searchQueryVo.getTwiceSearchVo());
  155.                 //将二层条件噻到最外层条件去(这里只能使用boolQuery,才能实现在filter使用match/multi-match 这种全文匹配)
  156.                 outBoolQueryBuilder.filter(in1BoolQueryBuilder);
  157.                 BuildWhere.setDelWhere(outBoolQueryBuilder);
  158.                 return outBoolQueryBuilder;
  159.             }
  160.         }
  161.     }
复制代码
构建复杂对象,还得是builder.build()。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

罪恶克星

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表