@SuppressWarnings({"unchecked", "rawtypes"})
  public void execute(
      Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body)
      throws TemplateException, IOException {
    Long articleCategoryId =
        FreemarkerUtils.getParameter(ARTICLE_CATEGORY_ID_PARAMETER_NAME, Long.class, params);
    Long[] tagIds = FreemarkerUtils.getParameter(TAG_IDS_PARAMETER_NAME, Long[].class, params);

    ArticleCategory articleCategory = articleCategoryService.find(articleCategoryId);
    List<Tag> tags = tagService.findList(tagIds);

    List<Article> articles;
    if ((articleCategoryId != null && articleCategory == null)
        || (tagIds != null && tags.isEmpty())) {
      articles = new ArrayList<Article>();
    } else {
      boolean useCache = useCache(env, params);
      String cacheRegion = getCacheRegion(env, params);
      Integer count = getCount(params);
      List<Filter> filters = getFilters(params, Article.class);
      List<Order> orders = getOrders(params);
      if (useCache) {
        articles =
            articleService.findList(articleCategory, tags, count, filters, orders, cacheRegion);
      } else {
        articles = articleService.findList(articleCategory, tags, count, filters, orders);
      }
    }
    setLocalVariable(VARIABLE_NAME, articles, env, body);
  }
 /** 生成索引 */
 @RequestMapping(value = "/build", method = RequestMethod.POST)
 public @ResponseBody Map<String, Object> build(
     BuildType buildType, Boolean isPurge, Integer first, Integer count) {
   long startTime = System.currentTimeMillis();
   if (first == null || first < 0) {
     first = 0;
   }
   if (count == null || count <= 0) {
     count = 50;
   }
   int buildCount = 0;
   boolean isCompleted = true;
   if (buildType == BuildType.article) {
     if (first == 0 && isPurge != null && isPurge) {
       searchService.purge(Article.class);
     }
     List<Article> articles = articleService.findList(null, null, null, first, count);
     for (Article article : articles) {
       searchService.index(article);
       buildCount++;
     }
     first += articles.size();
     if (articles.size() == count) {
       isCompleted = false;
     }
   } else if (buildType == BuildType.product) {
     if (first == 0 && isPurge != null && isPurge) {
       searchService.purge(Product.class);
     }
     List<Product> products = productService.findList(null, null, null, first, count);
     for (Product product : products) {
       searchService.index(product);
       buildCount++;
     }
     first += products.size();
     if (products.size() == count) {
       isCompleted = false;
     }
   }
   long endTime = System.currentTimeMillis();
   Map<String, Object> map = new HashMap<String, Object>();
   map.put("first", first);
   map.put("buildCount", buildCount);
   map.put("buildTime", endTime - startTime);
   map.put("isCompleted", isCompleted);
   return map;
 }