import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
public class FullTextSearch {
/**
* 获取命中关键字,按命中分值由高到低排序。可以设置标题和正文的不同分值最多返回maxKeyNumber个关键字
* @param keyList 需要进行匹配的关键字列表
* @param title 文章标题
* @param titleFactor 文章标题的权重
* @param content 文章正文
* @param cFactor 文章正文的权重
* @param maxKeyNumber 返回最多多少个匹配出来的关键字
* @return 匹配出来的关键字列表
*/
public List<String> getHitKeys(List<String> keyList,String title,int titleFactor,String content,int cFactor,int maxKeyNumber){
return getList(keyList, title, content).subList(0, maxKeyNumber);
}
/**
* 用来获取标题中的关键字出现次数
* @param keyList
* @param title
* @return
*/
private Map<String,Integer> getHitTitle(List<String> keyList,String title){
String keyWord="";
int count=0;
boolean tag=false;
int pos=0;
String temp =title;
Map<String,Integer> hitMap=new LinkedHashMap<String,Integer>();
for(int i=0;i<keyList.size();i++){
keyWord=keyList.get(i);
while(temp.indexOf(keyWord,pos)!=-1){
count++;
tag=true;
pos = temp.indexOf(keyWord, pos+keyWord.length());
if(pos==-1) break;
}
if(tag){
tag=false;
hitMap.put(keyWord, count);
count=0;
keyWord="";
}
}
return hitMap;
}
/**
* 在文章中关键次出现的次数
* @param keyList
* @param content
* @return
*/
private Map<String,Integer> getHitContent(List<String> keyList,String content){
String keyWord="";
int count=0;
boolean tag=false;
int pos=0;
String temp =content;
Map<String,Integer> hitMap=new LinkedHashMap<String,Integer>();
for(int i=0;i<keyList.size();i++){
keyWord=keyList.get(i);
while(temp.indexOf(keyWord,pos)!=-1){
count++;
tag=true;
pos = temp.indexOf(keyWord, pos+keyWord.length());
if(pos==-1) break;
}
if(tag){
tag=false;
pos=0;
hitMap.put(keyWord, count);
count=0;
keyWord="";
}
}
return hitMap;
}
/*
* 对map的value进行排序
*/
private static Map.Entry[] getSortedHashtableByValue(Map h) {
Set set = h.entrySet();
Map.Entry[] entries = (Map.Entry[]) set.toArray(new Map.Entry[set
.size()]);
Arrays.sort(entries, new Comparator() {
public int compare(Object arg0, Object arg1) {
Long key1 = Long.valueOf(((Map.Entry) arg0).getValue().toString());
Long key2 = Long.valueOf(((Map.Entry) arg1).getValue().toString());
return key2.compareTo(key1);
}
});
return entries;
}
/**
* 将排序好的值放入到List中
* @param keyList
* @param title
* @param content
* @return
*/
private List<String> getList(List<String> keyList,String title,String content){
List list =new ArrayList();
Entry[] mapTitle= FullTextSearch.getSortedHashtableByValue(this.getHitTitle(keyList, title));
Entry[] mapContent= FullTextSearch.getSortedHashtableByValue(this.getHitContent(keyList, content));
for(int i=0;i<mapTitle.length;i++){
list.add(mapTitle[i].getKey());
}
for(int j=0;j<mapContent.length;j++){
if(list.contains(mapContent[j].getKey())) continue;
list.add(mapContent[j].getKey());
}
return list;
}
public static void main(String[] args) {
List list = new ArrayList();
list.add("机床");
list.add("金属加工");
list.add("机床附件");
list.add("机械制造");
list.add("工业展会");
list.add("磨床");
String title="机床三大工业展11月机床亮相上海";
String content="作为中国国际工业博览会旗下专业展的2009数控机床与金属加工展、2009工业自动化展和2009新能源与电力电工展将于今年11月3-7日在上海新国际博览中心隆重召开。三大工业展同时登陆申城,预计将吸引来自全球1,150家企业在近8万平方米的展出面积上,倾力展示数控机床与金属加工领域、工业和自动化领域以及电力电工行业的最新产品和技术,为超过10万海内外观众和专业买家献上一场行业盛宴。"+
"在本届数控机床与金属加工展上,以涵盖金属薄板切割、数控转塔冲床、冲剪复合机及自动生产线、数控板料折弯机及折弯中心等范畴的金属成型机床将显示出数控、精密、高效等较强的中高端特色,而以围绕工程材料进行切削加工的金属切削机床则将为本届展会带来车床、加工中心、磨床和镗铣床等的重点产品。"+
"现场一应俱全的产品、优质专业的服务都将全力满足整个金属加工领域各种产品的生产需求。此外,金属加工领域相关的工夹具、测量、数控系统与机床附件的领先产品也将亮相展会现场。作为国内最具规模、最具专业水准的2009工业自动化展将展现行业技术的无穷魅力。为自动化制造商、销售商以及自动化设备、元器件采购商等专业人士提供一个交流和贸易的理想平台。"+
"同时,本届展会还将继续关注“工业安全技术”这一主题,在重点展示的机器人展区上演动感十足的机器人及自动化组装技术现场秀。如此精良的展品、精彩的展示,必将掀起自动化技术应用和产业升级的新一轮热潮。"+
"在今年的新能源与电力电工展上,主办方为配合市场导向和国家节能减排的目标,展会全面细分能源领域,精心整合发电设备、电力电工技术、电力测控仪器、电气自动化技术与设备、输电、配电设备及附件等电力电工领域资源,集合海内外行业知名企业最先进的产品和技术,为海内外供应商和国内用户精心打造了一个理想的设备技术交流平台。"+
"三大工业展同期还将举办一系列高质量的论坛和相关活动,业内专家学者、产品用户和生产厂商的专业人士将汇聚一堂,深入剖析行业发展趋势。此外,主办方积极的海外市场推广成功邀请到来自机械化工和冶金等领域的大批专业买家前来展会现场。美国最大的行业协会之一的美国机械制造技术协会也将首次携领其会员奔赴展会,为国内机床行业带来国际最为领先的产品与资讯。"+
"2009数控机床与金属加工展、2009工业自动化展和2009新能源与电力电工展由德国汉诺威展览公司、汉诺威米兰展览(上海)有限公司和上海世博(集团)有限公司联合承办。三大工业展会联袂上演,必将进一步加强观众与展商的商贸联系与交流合作,同时也将为正在经历着金融海啸的中国乃至亚太地区的工业提振信心,点燃希望。";
List lis = new FullTextSearch().getHitKeys(list, title, 0, content, 0, list.size());
for(int i=0;i<lis.size();i++){
System.out.println(lis.get(i));
}
}
}