我正在基于OpenCMS的Intranet网站上工作,我想在该网站中包含标签云.我找到了一些开源的tagcloud java库(例如OpenCloud).您是否有将这两个(或其他tagcloud库OpenCMS)连接在一起的经验?
解决方法:
好的,最后我自己部分解决了这个问题.我还使用了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;
}
}
希望这对我有所帮助,因为我花了很多时间来解决这个问题!
标签:cloud,opencms,java,tags 来源: https://codeday.me/bug/20191106/2001477.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。