3

私は OpenCMS に基づくイントラネット Web サイトに取り組んでおり、サイトにタグ クラウドを含めたいと考えています。オープンソースの tagcloud Java ライブラリ (OpenCloud など) をいくつか見つけました。これら 2 つ (または他のタグクラウド ライブラリ + OpenCMS) を一緒に配線した経験はありますか?

4

2 に答える 2

4

わかりましたので、最終的にこれを部分的に自分で解決しました。また、Richard Friedman のタグ クラウドからいくつかのコードを使用しました。

私がそれを行う方法は次のとおりです: 指定された間隔で、OpenCMS は Lucene インデックスを読み取り、「キーワード」フィールド (VFS のすべてのファイルに入力できる) からすべての用語を抽出するスケジュールされたジョブを実行し、タグを生成します。クラウドに保存し、OpenCMS テンプレートの一部であるファイルに結果を保存します。Cloud.java と BuildTagCloud.java の 2 つの 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;
    }
}

私はそれを理解するのに非常に多くの時間を費やしたので、これが誰かを助けることができることを願っています!

于 2010-03-02T14:55:23.067 に答える
0

tagsFile に設定した情報の種類を理解しています。テンプレートの要素名について

于 2010-04-27T12:27:29.307 に答える