将标签云添加到 OpenCMS 网站

发布于 2024-08-19 23:26:23 字数 125 浏览 1 评论 0原文

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

I'm working on an intranet website based on OpenCMS and I'd like to include a tag cloud to the site. I've found some opensource tagcloud java libraries (like OpenCloud). Do you have any experience with wiring those two (or other tagcloud libraries+OpenCMS) together?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

最初的梦 2024-08-26 23:26:23

好吧,最后我自己部分解决了这个问题。我还使用了 Richard Friedman 的 标签云 中的一些代码。

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

BuildTagCloud.java:Cloud.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);  
  }

}

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;
    }
}

希望这可以帮助别人,因为我花了很多时间来解决它!

OK so I solved this partly myself in the end. I also used some code from Richard Friedman's tag cloud.

The way I do it is the following: At specified intervals, OpenCMS runs a scheduled job that reads the Lucene index, extracts all the terms from the "keyword" fields (which can be filled in for every file in VFS), generates the tag cloud and stores the result in a file that is part of my OpenCMS template. There are two Java files: Cloud.java and BuildTagCloud.java. "Cloud" reads the index and returns a List of the most common terms. "BuildTagCloud" implements I_CmsScheduledJob interface and is registered as a scheduled job.

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;
    }
}

Hope this can help someone as I spent an awful lot of time figuring it out!

山人契 2024-08-26 23:26:23

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

I understand what type of information I set on tagsFile. On element name of my template?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文