好的,最后我自己部分解决了这个问题.我还使用了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 = "
";
data += sdf.format(cal.getTime()) + "
";
try {
List list = cloud.getCloud();
for(int i = 0; i
data += "
" + i + ". " + list.get(i).term.text() + " ... " + list.get(i).docFreq; // list.get(i).docFreq
}
} catch (Exception e) {
data += e.getMessage();
data += "
";
} finally {
data+="
}
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 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 res = new ArrayList( 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;
}
}
希望这对我有所帮助,因为我花了很多时间来解决这个问题!