【问题标题】:Adding a tag cloud to an OpenCMS website将标签云添加到 OpenCMS 网站
【发布时间】:2011-01-12 15:02:36
【问题描述】:

我正在开发一个基于 OpenCMS 的 Intranet 网站,我想在该网站中加入一个标签云。我找到了一些开源 tagcloud java 库(如 OpenCloud)。您是否有将这两个(或其他 tagcloud 库 + OpenCMS)连接在一起的经验?

【问题讨论】:

    标签: java tags cloud opencms


    【解决方案1】:

    好的,所以我最终自己部分解决了这个问题。我还使用了 Richard Friedman 的 tag cloud 中的一些代码。

    我这样做的方法如下:在指定的时间间隔内,OpenCMS 运行一个读取 Lucene 索引的计划作业,从“关键字”字段中提取所有术语(可以为 VFS 中的每个文件填写),生成标签云并将结果存储在一个文件中,该文件是我的 OpenCMS 模板的一部分。有两个 Java 文件:Cloud.java 和 BuildTagCloud.java。 “云”读取索引并返回最常用术语的列表。 “BuildTagCloud”实现了I_CmsScheduledJob接口,注册为定时作业。

    BuildTagCloud.java:

    package mypackage;
    
    import org.opencms.file.*;
    import org.opencms.main.*;
    import org.opencms.scheduler.I_CmsScheduledJob;
    import java.text.SimpleDateFormat;
    import java.util.*;
    
    
    public class BuildTagCloud implements I_CmsScheduledJob {
    
      private final String indexaddress = "address/of/your/index/folder"; // something like ../webapps/opencms/WEB-INF/index/nameOfIndex
      private final String tagsFile = "address"; // part of my template; it's where I store the tag cloud
      private final int numTerms = 10; // number of terms in the tag cloud                                                                   
    
    
      public String launch(CmsObject object, java.util.Map parameters) throws java.lang.Exception {
          Cloud cloud = new Cloud(indexaddress, numTerms);
    
          Calendar cal = Calendar.getInstance();
          SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
          String data;
          data = "<div style=\"border-top: 3px solid #000099; padding-top: 6px; margin-top: 17px;\"><span style=\"font-weight: bold; font-size: 11px; color: #000099;\">Tag cloud</span><br />";
          data += sdf.format(cal.getTime()) + "<br />";
    
          try {
              List<TermInfo> list = cloud.getCloud();
    
              for(int i = 0; i<list.size(); i++) {
                  data += "<br />" + i + ". " + list.get(i).term.text() + " ... " + list.get(i).docFreq; // list.get(i).docFreq
              }
    
          } catch (Exception e) {
    
              data += e.getMessage();
              data += "<br />";
    
          } finally {
    
              data+="</div>";
          }
    
          writeAndPublishResource(object, tagsFile, data);
    
          return "OK";
      }
    
      private void writeAndPublishResource(CmsObject object, String resouce, String data) throws java.lang.Exception {
          object.loginUser("administrator's user name", "and his password");
    
          CmsRequestContext cmsContext = object.getRequestContext();
          CmsProject curProject = cmsContext.currentProject();
    
          if(curProject.isOnlineProject()){
                CmsProject offlineProject = object.readProject("Name of the project");
                cmsContext.setCurrentProject(offlineProject);
          }
          CmsResource res = object.readResource(resouce);
          object.lockResource(resouce);
          CmsFile file = object.readFile(res);
          file.setContents(data.getBytes());
          object.writeFile(file);
          OpenCms.getPublishManager().publishResource(object, resouce);
          object.unlockResource(resouce);  
      }
    
    }
    

    Cloud.java:

    package mypackage;
    
    import java.io.*;
    import java.util.*;
    import org.apache.lucene.index.*;
    
    public class Cloud {
    
        private String indexaddress;
        private int numTerms;
    
        private int max;
        private int sum;
    
        public Cloud(String indexaddress, int numTerms) {
            this.indexaddress = indexaddress;
            this.numTerms = numTerms;
            max = 0;
            sum = 0;
        }
    
        public List<TermInfo> getCloud() throws Exception {
    
            TermInfoQueue termQ = new TermInfoQueue(numTerms);
    
            IndexReader reader = IndexReader.open(new File(indexaddress));
            TermEnum terms = reader.terms();
    
    
    
            int minFreq = 0;
            while (terms.next()) {
    
                if (!terms.term().field().equals("keywords")) continue;
    
                if ( terms.docFreq() > minFreq) {
                    if (termQ.size() >= numTerms)            // if tiq overfull
                    {
                        termQ.pop();                 // remove lowest in tiq
                        termQ.put(new TermInfo(terms.term(), terms.docFreq()));
                        minFreq = ((TermInfo)termQ.top()).docFreq; // reset minFreq
                    } else {
                        termQ.put(new TermInfo(terms.term(), terms.docFreq()));
                    }
                }
            }
    
            terms.close();
            reader.close();
    
            ArrayList<TermInfo> res = new ArrayList<TermInfo>( termQ.size() );
            while ( termQ.size() > 0 ) {
                TermInfo ti = (TermInfo)termQ.pop();
                max = Math.max( max, ti.docFreq );
                sum += ti.docFreq;
                res.add( ti );
            }
    
            // Shuffles the results up, since a sorted cloud would be predictiable.
            //Collections.shuffle( res );
    
            return res;
          }
    
          public int getMaxFrequency() {
              return max;
          }
    }
    
    class TermInfo {
    
        TermInfo(Term t, int df) {
            term = t;
            docFreq = df;
        }
    
        public int docFreq;
        public Term term;
    }
    
    class TermInfoQueue extends org.apache.lucene.util.PriorityQueue {
    
        TermInfoQueue(int size) {
            initialize(size);
        }
    
        protected final boolean lessThan(Object a, Object b) {
            TermInfo termInfoA = (TermInfo)a;
            TermInfo termInfoB = (TermInfo)b;
            return termInfoA.docFreq < termInfoB.docFreq;
        }
    }
    

    希望这可以帮助某人,因为我花了很多时间弄清楚它!

    【讨论】:

      【解决方案2】:

      我了解我在 tagsFile 上设置的信息类型。在我的模板的元素名称上?

      【讨论】:

        猜你喜欢
        • 2015-12-04
        • 2012-10-24
        • 1970-01-01
        • 1970-01-01
        • 2017-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-22
        相关资源
        最近更新 更多