1.面向应用
最近公司新开发的电商平台,要实现一些违禁词过滤。需求很简单,就是从数据库中读取内容,包括资讯,产品,公司简介之类,看看是否存在违禁词,有的话就把这条记录的ID存入违禁词文档。可以应用于分词库匹配检索,如关键字、敏感词的标识,起到过滤的作用。
2.设计思想
采用了哈希表与树相结合的思想,哈希表中放的是关键词的首字符相同和以该首字符开始的树根节点。
3.方案的优缺点
首先使用了树来保存违禁词,节省了前缀相同汉字的内存空间,以HashMap作为索引提高了匹配的效率。继承了HashMap的快速定位优点,在以树的形式保存关键字,比HashMap节省空间。又因为不同汉字开头的是不同的小树,小树的查询效率比所有的节点挂载在大树上的效率有更大的提高。
节点类
TreeNode.Class
package word;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class TreeNode implements Serializable {
private int isLast; //是否是关键字结束节点
private String nodeName; //节点名
private TreeNode parentNode; //父节点
private List<TreeNode> childList; //子节点
public TreeNode() {
initChildList();
}
public void initChildList() {
if (childList == null)
childList = new ArrayList<TreeNode>();
}
public int getIsLast() {
return isLast;}
public void setIsLast(int isLast) {
this.isLast = isLast;}
public String getNodeName() {
return nodeName;}
public void setNodeName(String nodeName) {
this.nodeName = nodeName;}
public TreeNode getParentNode() {
return parentNode;}
public void setParentNode(TreeNode parentNode) {
this.parentNode = parentNode;}
public List<TreeNode> getChildList() {
return childList;}
public void setChildList(List<TreeNode> childList) {
this.childList = childList;}
}
树的操作类
TreeHelper.Class
package word;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by Administrator on 2016/3/22.
*
* @version $Revision$ $Date$
* 2016/3/22
* 14:09
* @author: Administrator
* @since 3.0
*/
public class TreeHelper {
private Boolean isExit; //是否存在违禁词
private int maxLength; //记录树的最大长度
private int index; //最大匹配位置
private Map<String,TreeNode> map; //树根索引
private List<String> indexList; //记录关键词的位置
public