我正在开发基于OpenCMS的Intranet网站,我想在网站上加入标签云。我找到了一些opensource tagcloud java库(比如OpenCloud)。您是否有将这两个(或其他tagcloud库+ OpenCMS)连接在一起的经验?
答案 0 :(得分:4)
好的,所以我最终解决了这个问题。我还使用了Richard Friedman的tag cloud的一些代码。
我这样做的方法如下:在指定的时间间隔内,OpenCMS运行一个读取Lucene索引的预定作业,从“关键字”字段中提取所有术语(可以为VFS中的每个文件填写),生成标签云并将结果存储在我的OpenCMS模板中的文件中。有两个Java文件:Cloud.java和BuildTagCloud.java。 “Cloud”读取索引并返回最常用术语的列表。 “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;
}
}
希望这可以帮助别人,因为我花了很多时间搞清楚它!
答案 1 :(得分:0)
我了解我在tagsFile上设置的信息类型。在我的模板的元素名称?