gpt4 book ai didi

java - 将标签云添加到 OpenCMS 网站

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:29:10 26 4
gpt4 key购买 nike

我正在一个基于 OpenCMS 的内联网网站上工作,我想在网站中包含一个标签云。我找到了一些开源的 tagcloud java 库(比如 OpenCloud)。您有将这两个(或其他 tagcloud 库+OpenCMS)连接在一起的经验吗?

最佳答案

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

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

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

}

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

希望这可以帮助别人,因为我花了很多时间才弄明白!

关于java - 将标签云添加到 OpenCMS 网站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2192186/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com