Commit 0a66610c authored by zoujintao's avatar zoujintao

initialize

parents
Pipeline #14811 failed with stages
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.house365.xxx.newhouse</groupId>
<artifactId>xxx-newhouse</artifactId>
<version>1.0.0</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId> org.apache.lucene</groupId>
<artifactId>lucene-analyzers-smartcn</artifactId>
<version>4.9.0</version>
</dependency>
<dependency>
<groupId>com.house365.xxx.house</groupId>
<artifactId>house-common</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.0</version>
</dependency>
</dependencies>
<build>
<finalName>newhouse-search-query</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
package com.house365.xxx.newhouse.namecheck.bean;
public class MyWord {
private String name;
private String pinyin;
private String pyfst;
public MyWord(String name, String pinyin, String pyfst) {
super();
this.name = name;
this.pinyin = pinyin;
this.pyfst = pyfst;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPinyin() {
return pinyin;
}
public void setPinyin(String pinyin) {
this.pinyin = pinyin;
}
public String getPyfst() {
return pyfst;
}
public void setPyfst(String pyfst) {
this.pyfst = pyfst;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((pinyin == null) ? 0 : pinyin.hashCode());
result = prime * result + ((pyfst == null) ? 0 : pyfst.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
MyWord other = (MyWord) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (pinyin == null) {
if (other.pinyin != null)
return false;
} else if (!pinyin.equals(other.pinyin))
return false;
if (pyfst == null) {
if (other.pyfst != null)
return false;
} else if (!pyfst.equals(other.pyfst))
return false;
return true;
}
}
package com.house365.xxx.newhouse.namecheck.bean;
import java.util.List;
public class PrjBean {
private int pf_id;
private int prj_id;
private int prj_city;
private int prj_listid;
private int prj_channel;
private String prj_channel_str;
private String prj_itemname;
private String prj_promotionname;
private String prj_itemname_search;
private String prj_pinyin;
private String prj_dist_str;
private String prj_block_str;
private String prj_loc;
private String prj_kfsname;
private String tag;
private int dateline;
private int del;
// 加权
private float prj_ob;
private List<String> lstPY;
private String pyfst;
private int wid;
private String info;
private String info2;
//楼盘状态
private int sale_status;
public PrjBean(int pf_id, int prj_id, int prj_city, int prj_listid,
int prj_channel, String prj_channel_str, String prj_itemname, String prj_promotionname,
String prj_itemname_search, String prj_pinyin, String prj_dist_str,
String prj_block_str, String prj_loc, String prj_kfsname,
String tag, int dateline, int del, float prj_ob,
List<String> lstPY, String pyfst,int wid,String info,String info2,int sale_status) {
super();
this.pf_id=pf_id;
this.prj_id = prj_id;
this.prj_city = prj_city;
this.prj_listid = prj_listid;
this.prj_channel = prj_channel;
this.prj_channel_str = prj_channel_str;
this.prj_itemname = prj_itemname;
this.prj_promotionname = prj_promotionname;
this.prj_itemname_search = prj_itemname_search;
this.prj_pinyin = prj_pinyin;
this.prj_dist_str = prj_dist_str;
this.prj_block_str = prj_block_str;
this.prj_loc = prj_loc;
this.prj_kfsname = prj_kfsname;
this.tag = tag;
this.dateline = dateline;
this.del = del;
this.prj_ob = prj_ob;
this.lstPY = lstPY;
this.pyfst = pyfst;
this.wid=wid;
this.info=info;
this.info2=info2;
this.sale_status=sale_status;
}
public int getWid() {
return wid;
}
public String getInfo() {
return info;
}
public String getInfo2() {
return info2;
}
public List<String> getLstPY() {
return lstPY;
}
public String getPyfst() {
return pyfst;
}
public int getPrj_id() {
return prj_id;
}
public int getPrj_city() {
return prj_city;
}
public int getPrj_listid() {
return prj_listid;
}
public int getPrj_channel() {
return prj_channel;
}
public String getPrj_channel_str() {
return prj_channel_str;
}
public String getPrj_itemname() {
return prj_itemname;
}
public String getPrj_promotionname() {
return prj_promotionname;
}
public String getPrj_itemname_search() {
return prj_itemname_search;
}
public String getPrj_pinyin() {
return prj_pinyin;
}
public String getPrj_dist_str() {
return prj_dist_str;
}
public String getPrj_block_str() {
return prj_block_str;
}
public String getPrj_loc() {
return prj_loc;
}
public String getPrj_kfsname() {
return prj_kfsname;
}
public String getTag() {
return tag;
}
public int getDateline() {
return dateline;
}
public int getDel() {
return del;
}
public float getPrj_ob() {
return prj_ob;
}
public int getSale_status() {
return sale_status;
}
public void setSale_status(int sale_status) {
this.sale_status = sale_status;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + pf_id;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
PrjBean other = (PrjBean) obj;
if (pf_id != other.pf_id)
return false;
return true;
}
public int getPf_id() {
return pf_id;
}
}
package com.house365.xxx.newhouse.namecheck.bean;
public class ResultBean implements Comparable<ResultBean> {
private WordBean wordBean;
public ResultBean(WordBean wordBean) {
super();
this.wordBean = wordBean;
}
@Override
public String toString() {
return "ResultBean [wordBean=" + wordBean + "]";
}
public float getFinalScore() {
// return wordBean.getScore();
return getWordRatio() * 0.6f +wordBean.getPrjBean().getPrj_ob();
}
public float getWordRatio() {
return wordBean.getRatio();
}
public PrjBean getPrjBean() {
return wordBean.getPrjBean();
}
@Override
public int compareTo(ResultBean o) {
if (getFinalScore() == o.getFinalScore()) {
return 0;
}
return getFinalScore() > o.getFinalScore() ? -1 : 1;
}
public WordBean getWordBean() {
return wordBean;
}
public void setWordBean(WordBean wordBean) {
this.wordBean = wordBean;
}
}
package com.house365.xxx.newhouse.namecheck.bean;
public class WordBean implements Comparable<WordBean>{
private String word;
private float ratio;
private PrjBean prjBean;
public WordBean(String word, float ratio,PrjBean prjBean) {
this.word = word;
this.ratio = ratio;
this.prjBean=prjBean;
}
public PrjBean getPrjBean() {
return prjBean;
}
public void setPrjBean(PrjBean prjBean) {
this.prjBean = prjBean;
}
@Override
public int hashCode() {
return prjBean.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
WordBean other = (WordBean) obj;
return this.prjBean.equals(other.prjBean);
}
@Override
public String toString() {
return "WordBean [word=" + word + ", ratio=" + ratio +", prj_ob=" + prjBean.getPrj_ob()+"]";
}
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
public float getRatio() {
return ratio;
}
public void setRatio(float ratio) {
this.ratio = ratio;
}
@Override
public int compareTo(WordBean o) {
if (getRatio() == o.getRatio()) {
return 0;
}
return getRatio() >o.getRatio() ? -1 : 1;
}
}
package com.house365.xxx.newhouse.namecheck.core;
public enum CheckType {
PINYIN, HANZI, PINYINSX,TAG
}
package com.house365.xxx.newhouse.namecheck.core;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.house365.xxx.newhouse.namecheck.bean.PrjBean;
import com.house365.xxx.newhouse.namecheck.bean.ResultBean;
import com.house365.xxx.newhouse.namecheck.bean.WordBean;
import com.house365.xxx.newhouse.namecheck.util.DistanceCalculate;
import com.house365.xxx.newhouse.namecheck.util.PinyinToolkit;
@Component
public class DistanceChecker {
private static Log logger = LogFactory.getLog(DistanceChecker.class);
@Autowired
private NewProjectBeanLoader projectBeanLoader;
public void init() {
projectBeanLoader.load();
}
// 中文匹配--》拼音匹配--》首字母匹配--》tag
private HashSet<WordBean> getWordsWB(int city, String word) {
HashSet<WordBean> setWB = new HashSet<WordBean>();
boolean isHanziFirst = isHanziFirst(word);
if (isHanziFirst) {
List<WordBean> resultFromName = getWordsByName(city, word);
setWB.addAll(resultFromName);
if (setWB.isEmpty()) {
List<WordBean> resultFromPY = getWordsByPY(city, PinyinToolkit.cn2Spell(word));
setWB.addAll(resultFromPY);
}
} else {
List<WordBean> resultFromPY = getWordsByPY(city, PinyinToolkit.cn2Spell(word));
setWB.addAll(resultFromPY);
if (setWB.isEmpty()) {
List<WordBean> resultFromName = getWordsByName(city, word);
setWB.addAll(resultFromName);
}
}
if (setWB.isEmpty()) {
List<WordBean> resultFromPYFst = getWordsByPYFst(city, PinyinToolkit.cn2FirstSpell(word));
setWB.addAll(resultFromPYFst);
}
if (setWB.isEmpty()) {
List<WordBean> resultFromTag = getWordsByTag(city, word);
setWB.addAll(resultFromTag);
}
return setWB;
}
private boolean isHanziFirst(String word) {
boolean result = false;
int hanziCount = PinyinToolkit.countHanzi(word);
if (hanziCount > 0) {
result = true;
}
return result;
}
public List<ResultBean> getWords(int city, String word) {
List<WordBean> lstTempWB = new ArrayList<>();
lstTempWB.addAll(getWordsWB(city, word));
// String fWord = filter.filter(word);
// if (!word.equalsIgnoreCase(fWord)) {
// lstTempWB.addAll(getWordsWB(city, filter.filter(word)));
// }
Collections.sort(lstTempWB);
int size1 = 100 > lstTempWB.size() ? lstTempWB.size() : 100;
List<ResultBean> lstRSt = new ArrayList<ResultBean>();
List<WordBean> lstWB = lstTempWB.subList(0, size1);
for (WordBean wb : lstWB) {
lstRSt.add(new ResultBean(wb));
}
Collections.sort(lstRSt);
int size = 30 > lstRSt.size() ? lstRSt.size() : 30;
List<ResultBean> lstRS = lstRSt.subList(0, size);
return lstRS;
}
public List<WordBean> getWordsByName(int city, String word) {
HashSet<PrjBean> prjBeans = projectBeanLoader.getSetPrjBean(city);
if (prjBeans != null) {
return findWordsByWordDis(word, prjBeans, null, CheckType.HANZI);
}
return new ArrayList<WordBean>();
}
public List<WordBean> getWordsByPY(int city, String py) {
List<WordBean> lstRs = new ArrayList<WordBean>();
HashSet<PrjBean> prjBeans = projectBeanLoader.getSetPrjBean(city);
if (prjBeans != null) {
List<String> lstRPY = PinyinToolkit.rMatch(py);
if (!lstRPY.isEmpty()) {
lstRs = findWordsByWordDis(py, prjBeans, lstRPY, CheckType.PINYIN);
}
}
return lstRs;
}
public List<WordBean> getWordsByPYFst(int city, String pyFst) {
List<WordBean> lstRs = new ArrayList<WordBean>();
HashSet<PrjBean> prjBeans = projectBeanLoader.getSetPrjBean(city);
if (prjBeans != null) {
lstRs = findWordsByWordDis(pyFst, prjBeans, null, CheckType.PINYINSX);
}
return lstRs;
}
public List<WordBean> getWordsByTag(int city, String word) {
List<WordBean> lstRs = new ArrayList<WordBean>();
HashSet<PrjBean> prjBeans = projectBeanLoader.getSetPrjBean(city);
if (prjBeans != null) {
lstRs = findWordsByWordDis(word, prjBeans, null, CheckType.TAG);
}
return lstRs;
}
private List<WordBean> findWordsByWordDis(String word, HashSet<PrjBean> dic, List<String> lstPY, CheckType type) {
List<WordBean> lstRs = new ArrayList<WordBean>();
for (PrjBean prjBean : dic) {
float matchRate = 0;
String name = prjBean.getPrj_itemname_search();
int sale_status = prjBean.getSale_status();
switch (type) {
case PINYIN:
name = prjBean.getPrj_pinyin();
break;
case PINYINSX:
name = prjBean.getPyfst();
break;
case TAG:
name = prjBean.getTag();
break;
default:
break;
}
String lw = name.toLowerCase();
if (lw.startsWith(word)) {
matchRate = 1.0f;
} else if (lw.contains(word)) {
matchRate = 0.9f;
} else {
float myLen = 0;
float dicLen = 0;
float dis = 0;
if (lstPY != null) {
List<String> lstWordsInDic = prjBean.getLstPY();
dicLen = lstWordsInDic.size();
myLen = lstPY.size();
dis = DistanceCalculate.getSentenceDistance(lstPY.toArray(new String[(int) myLen]),
lstWordsInDic.toArray(new String[(int) dicLen]));
} else {
dicLen = lw.length();
myLen = word.length();
dis = DistanceCalculate.getWordDistance(word, lw);
}
float len = myLen > dicLen ? myLen : dicLen;
float matchSize = len - dis;
matchRate = matchSize / dicLen;
}
if (type == CheckType.TAG) {
matchRate = matchRate * 0.8f;
}
if (matchRate > 0.2) {
lstRs.add(new WordBean(name, matchRate+getMatchRateAdd(sale_status), prjBean));
}
}
return lstRs;
}
/**
* @param sale_status 楼盘状态
* @return 权重加分
*/
private float getMatchRateAdd(int sale_status) {
float rate = 0;
switch (sale_status) {
case 3:
rate = 0.4f;
break;
case 2:
rate = 0.2f;
break;
default:
break;
}
return rate;
}
}
package com.house365.xxx.newhouse.namecheck.core;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.house365.xxx.newhouse.namecheck.bean.PrjBean;
import com.house365.xxx.newhouse.namecheck.db.DefDbcpPoolHelper;
import com.house365.xxx.newhouse.namecheck.util.PinyinToolkit;
/**
*
* @author dzw 20151123
*
*/
@Component
public class NewProjectBeanLoader {
private static Log logger = LogFactory.getLog(NewProjectBeanLoader.class);
@Autowired
private DefDbcpPoolHelper dbcpPoolHelper;
private HashMap<Integer, HashSet<PrjBean>> mapCityPrjBean = new HashMap<Integer, HashSet<PrjBean>>();
public HashSet<PrjBean> getSetPrjBean(int city) {
return mapCityPrjBean.get(city);
}
public void load() {
logger.info("load new project start");
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "select pf_id,prj_id,prj_city,prj_listid,prj_channel,prj_channel_str,prj_itemname,prj_promotionname,prj_itemname_search,prj_pinyin,prj_dist_str,prj_block_str,prj_loc,prj_kfsname,tag,dateline,del,prj_ob,wid,info,info2,pinyin_all,sale_status from project_forsearch";
try {
con = dbcpPoolHelper.getConn();
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
int pf_id = rs.getInt("pf_id");
int prj_id = rs.getInt("prj_id");
int prj_city = rs.getInt("prj_city");
int prj_listid = rs.getInt("prj_listid");
int prj_channel = rs.getInt("prj_channel");
String prj_channel_str = rs.getString("prj_channel_str");
String prj_itemname = rs.getString("prj_itemname");
String prj_promotionname = rs.getString("prj_promotionname");
String prj_itemname_search = rs
.getString("prj_itemname_search");
String prj_pinyin = rs.getString("prj_pinyin");
String prj_dist_str = rs.getString("prj_dist_str");
String prj_block_str = rs.getString("prj_block_str");
String prj_loc = rs.getString("prj_loc");
String prj_kfsname = rs.getString("prj_kfsname");
String tag = rs.getString("tag");
int dateline = rs.getInt("dateline");
int del = rs.getInt("del");
float prj_ob = rs.getFloat("prj_ob");
int wid = rs.getInt("wid");
String info = rs.getString("info");
String info2 = rs.getString("info2");
String pinyin_all = rs.getString("pinyin_all");
int sale_status = rs.getInt("sale_status");
if (StringUtils.isNotBlank(prj_itemname_search)) {
prj_itemname_search = prj_itemname_search.trim();
List<String> lstPY = PinyinToolkit
.getLstCn2Spell(prj_itemname_search);
String pyFst = PinyinToolkit
.cn2FirstSpell(prj_itemname_search);
PrjBean prjBean = new PrjBean(pf_id, prj_id, prj_city,
prj_listid, prj_channel, prj_channel_str,
prj_itemname, prj_promotionname, prj_itemname_search, pinyin_all,
prj_dist_str, prj_block_str, prj_loc, prj_kfsname,
tag, dateline, del, prj_ob, lstPY, pyFst, wid,
info, info2,sale_status);
if (mapCityPrjBean.containsKey(prj_city)) {
HashSet<PrjBean> setPrjBean = mapCityPrjBean
.get(prj_city);
if (setPrjBean.contains(prjBean)) {
setPrjBean.remove(prjBean);
}
setPrjBean.add(prjBean);
} else {
HashSet<PrjBean> setPrjBean = new HashSet<PrjBean>();
setPrjBean.add(prjBean);
mapCityPrjBean.put(prj_city, setPrjBean);
}
}
}
} catch (SQLException e) {
logger.error(e.getMessage(), e);
} finally {
dbcpPoolHelper.release(rs, ps, con);
}
logger.info("load new project end");
}
}
package com.house365.xxx.newhouse.namecheck.db;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class DefDbcpPoolHelper {
private static Log log = LogFactory.getLog(DefDbcpPoolHelper.class);
@Autowired
private BasicDataSource dataSource;
public Connection getConn() throws SQLException {
return dataSource.getConnection();
}
public void release(ResultSet rs, Statement st, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
if (st != null) {
try {
st.close();
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}
}
\ No newline at end of file
package com.house365.xxx.newhouse.namecheck.job;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import com.house365.xxx.common.config.SystemStarter;
import com.house365.xxx.newhouse.namecheck.core.NewProjectBeanLoader;
import com.house365.xxx.newhouse.namecheck.servlet.ProjectQuery;
public class RefreshLoaderJob {
private static Log logger = LogFactory.getLog(RefreshLoaderJob.class);
public void work() {
logger.info("RefreshSearcherJob...");
SystemStarter s = ProjectQuery.getLoader();
ApplicationContext applicationContext = s.getApplicationContext();
NewProjectBeanLoader projectBeanLoader = applicationContext.getBean(NewProjectBeanLoader.class);
projectBeanLoader.load();
}
}
package com.house365.xxx.newhouse.namecheck.servlet;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jdom.CDATA;
import org.jdom.Document;
import org.jdom.Element;
import org.springframework.context.ApplicationContext;
import com.house365.xxx.common.config.SystemStarter;
import com.house365.xxx.common.util.DefDocOutputDevice;
import com.house365.xxx.common.util.DocConverter;
import com.house365.xxx.newhouse.namecheck.bean.PrjBean;
import com.house365.xxx.newhouse.namecheck.bean.ResultBean;
import com.house365.xxx.newhouse.namecheck.core.DistanceChecker;
public class ProjectQuery extends HttpServlet {
private static final long serialVersionUID = -1204947606286376668L;
private static Log logger = LogFactory.getLog(ProjectQuery.class);
private static SystemStarter loader = new SystemStarter();
private static DistanceChecker checker;
public void init() throws ServletException {
try {
loader.start();
ApplicationContext applicationContext = loader
.getApplicationContext();
checker = applicationContext.getBean(DistanceChecker.class);
checker.init();
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
public static SystemStarter getLoader() {
return loader;
}
public void doGet(HttpServletRequest request, HttpServletResponse response) {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) {
try {
request.setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException e) {
logger.error(e.getMessage(), e);
}
String city = request.getParameter("city");
String project = request.getParameter("project").trim().toLowerCase();
if (StringUtils.isNotBlank(city) && StringUtils.isNotBlank(project)) {
List<ResultBean> lstResult = checker.getWords(
Integer.valueOf(city), project);
Document document = new Document();
Element recordSet = getElement(lstResult);
document.addContent(recordSet);
String xml = null;
try {
xml = DocConverter.doc2String(document);
DefDocOutputDevice.showDoc(response, xml, "UTF-8");
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
}
private Element getElement(List<ResultBean> lstResultBean) {
Element root = new Element("RecordSet");
root.addContent(new Element("MSG").addContent("ok"));
root.addContent(new Element("TOTAL"));
for (ResultBean rsb : lstResultBean) {
PrjBean pBean = rsb.getPrjBean();
Element record = new Element("Record");
record.addContent(new Element("prj_id").addContent(new CDATA(String
.valueOf(pBean.getPrj_id()))));
record.addContent(new Element("prj_city").addContent(new CDATA(
String.valueOf(pBean.getPrj_city()))));
record.addContent(new Element("prj_listid").addContent(new CDATA(
String.valueOf(pBean.getPrj_listid()))));
record.addContent(new Element("prj_channel").addContent(new CDATA(
String.valueOf(pBean.getPrj_channel()))));
record.addContent(new Element("prj_channel_str")
.addContent(new CDATA(pBean.getPrj_channel_str())));
record.addContent(new Element("prj_itemname").addContent(new CDATA(
pBean.getPrj_itemname())));
record.addContent(new Element("prj_promotionname").addContent(new CDATA(
pBean.getPrj_promotionname())));
record.addContent(new Element("prj_itemname_search")
.addContent(new CDATA(pBean.getPrj_itemname_search())));
record.addContent(new Element("prj_pinyin").addContent(new CDATA(
pBean.getPrj_pinyin())));
record.addContent(new Element("prj_dist_str").addContent(new CDATA(
pBean.getPrj_dist_str())));
record.addContent(new Element("prj_block_str")
.addContent(new CDATA(pBean.getPrj_block_str())));
record.addContent(new Element("prj_loc").addContent(new CDATA(pBean
.getPrj_loc())));
record.addContent(new Element("prj_kfsname").addContent(new CDATA(
pBean.getPrj_kfsname())));
record.addContent(new Element("tag").addContent(new CDATA(pBean
.getTag())));
record.addContent(new Element("dateline").addContent(new CDATA(
String.valueOf(pBean.getDateline()))));
record.addContent(new Element("del").addContent(new CDATA(String
.valueOf(pBean.getDel()))));
record.addContent(new Element("wid").addContent(new CDATA(String
.valueOf(pBean.getWid()))));
record.addContent(new Element("info").addContent(new CDATA(String
.valueOf(pBean.getInfo()))));
record.addContent(new Element("info2").addContent(new CDATA(String
.valueOf(pBean.getInfo2()))));
record.addContent(new Element("prj_ob").addContent(new CDATA(String
.valueOf(pBean.getPrj_ob()))));
record.addContent(new Element("word_score").addContent(new CDATA(
String.valueOf(rsb.getWordRatio()))));
record.addContent(new Element("sale_status").addContent(new CDATA(
String.valueOf(pBean.getSale_status()))));
root.addContent(record);
}
return root;
}
}
package com.house365.xxx.newhouse.namecheck.util;
public class DistanceCalculate {
public static int getWordDistance(String word1, String word2) {
int distance = 0;
char[] mychar1 = word1.toCharArray();
char[] mychar2 = word2.toCharArray();
int len1 = mychar1.length;
int len2 = mychar2.length;
int cost;
int boundaryx = len1 + 1;
int boundaryy = len2 + 1;
int[][] dis = new int[boundaryx][boundaryy];
for (int i = 0; i <= len1; i++)
dis[i][0] = i;
for (int j = 0; j <= len2; j++)
dis[0][j] = j;
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
if (mychar1[i - 1] == mychar2[j - 1])
cost = 0;
else
cost = 1;
dis[i][j] = getMin(dis[i - 1][j] + 1, dis[i][j - 1] + 1,
dis[i - 1][j - 1] + cost);
}
}
distance = dis[len1][len2];
return distance;
}
public static int getMin(int a, int b, int c) {
int min = a;
if (b < min)
min = b;
if (c < min)
min = c;
return min;
}
public static float getSentenceDistance(String[] sentence1,
String[] sentence2) {
float distance = 0;
int len1 = sentence1.length;
int len2 = sentence2.length;
float cost;
int boundaryx = len1 + 1;
int boundaryy = len2 + 1;
float[][] dis = new float[boundaryx][boundaryy];
for (int i = 0; i <= len1; i++)
dis[i][0] = i;
for (int j = 0; j <= len2; j++)
dis[0][j] = j;
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
if (sentence1[i - 1].equals(sentence2[j - 1])) {
cost = 0;
} else {
cost = 1;
}
dis[i][j] = getMin(dis[i - 1][j] + 1, dis[i][j - 1] + 1,
dis[i - 1][j - 1] + cost);
}
}
distance = dis[len1][len2];
return distance;
}
public static float getMin(float a, float b, float c) {
float min = a;
if (b < min)
min = b;
if (c < min)
min = c;
return min;
}
public static void main(String[] args) {
String[] sentence1 = new String[] { "su", "ning" };
String[] sentence2 = new String[] { "su", "ning","ya","ju" };
System.out.println(getSentenceDistance(sentence1, sentence2));
}
}
package com.house365.xxx.newhouse.namecheck.util;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
public class PinyinToolkit {
public static String lRegEx = "(a[io]?|ou?|e[inr]?|ang?|ng|[bmp](a[io]?|[aei]ng?|ei|ie?|ia[no]|o|u)|pou|me|m[io]u|[fw](a|[ae]ng?|ei|o|u)|fou|wai|[dt](a[io]?|an|e|[aeio]ng|ie?|ia[no]|ou|u[ino]?|uan)|dei|diu|[nl](a[io]?|ei?|[eio]ng|i[eu]?|i?ang?|iao|in|ou|u[eo]?|ve?|uan)|nen|lia|lun|[ghk](a[io]?|[ae]ng?|e|ong|ou|u[aino]?|uai|uang?)|[gh]ei|[jqx](i(ao?|ang?|e|ng?|ong|u)?|u[en]?|uan)|([csz]h?|r)([ae]ng?|ao|e|i|ou|u[ino]?|uan)|[csz](ai?|ong)|[csz]h(ai?|uai|uang)|zei|[sz]hua|([cz]h|r)ong|y(ao?|[ai]ng?|e|i|ong|ou|u[en]?|uan))";
public static String rRegEx = "(a[io]?|ou?|e[inr]?|ang?|ng|[bmp](a[io]?|[aei]ng?|ei|ie?|ia[no]|o|u)|pou|me|m[io]u|[fw](a|[ae]ng?|ei|o|u)|fou|wai|[dt](a[io]?|an|e|[aeio]ng|ie?|ia[no]|ou|u[ino]?|uan)|dei|diu|[nl](a[io]?|ei?|[eio]ng|i[eu]?|i?ang?|iao|in|ou|u[eo]?|ve?|uan)|nen|lia|lun|[ghk](a[io]?|[ae]ng?|e|ong|ou|u[aino]?|uai|uang?)|[gh]ei|[jqx](i(ao?|ang?|e|ng?|ong|u)?|u[en]?|uan)|([csz]h?|r)([ae]ng?|ao|e|i|ou|u[ino]?|uan)|[csz](ai?|ong)|[csz]h(ai?|uai|uang)|zei|[sz]hua|([cz]h|r)ong|y(ao?|[ai]ng?|e|i|ong|ou|u[en]?|uan))$";
public static List<String> lMatch(String py) {
int tag = 0;
LinkedList<String> lstPY = new LinkedList<String>();
for (int i = py.length(); i > 0; i = i - tag) {
Pattern pat = Pattern.compile(lRegEx);
Matcher matcher = pat.matcher(py);
if (matcher.find()) {
lstPY.add(matcher.group());
tag = matcher.end() - matcher.start();
py = py.substring(tag);
}else{
break;
}
}
return lstPY;
}
public static List<String> rMatch(String py) {
int tag = 0;
LinkedList<String> lstPY = new LinkedList<String>();
for (int i = py.length(); i > 0; i = tag) {
Pattern pat = Pattern.compile(rRegEx);
Matcher matcher = pat.matcher(py);
if (matcher.find()) {
lstPY.push(matcher.group());
tag = matcher.start();
py = py.substring(0, matcher.start());
}else{
break;
}
}
return lstPY;
}
// 判断查询词中是否都为字母
public static boolean judgeLetter(String query) {
query = query.toLowerCase();
char[] array = query.toCharArray();
for (int i = 0; i < array.length; i++) {
if (array[i] < 'a' || array[i] > 'z') {
return false;
}
}
return true;
}
// 判断查询是否都为汉字
public static boolean judgeHanzi(String query) {
for (int i = 0; i < query.length(); i++) {
if (!query.substring(i, i + 1).matches("[\\u4e00-\\u9fa5]+")) {
return false;
}
}
return true;
}
// 计算汉字个数
public static int countHanzi(String word) {
int count = 0;
for (int i = 0; i < word.length(); i++) {
if (word.substring(i, i + 1).matches("[\\u4e00-\\u9fa5]+")) {
count++;
}
}
return count;
}
/**
* 获取汉字串拼音首字母,英文字符不变
*
* @param chinese
* 汉字串
* @return 汉语拼音首字母
*/
public static String cn2FirstSpell(String chinese) {
StringBuffer pybf = new StringBuffer();
char[] arr = chinese.toCharArray();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (int i = 0; i < arr.length; i++) {
if (arr[i] > 128) {
try {
String[] _t = PinyinHelper.toHanyuPinyinStringArray(arr[i],
defaultFormat);
if (_t != null) {
pybf.append(_t[0].charAt(0));
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
pybf.append(arr[i]);
}
}
return pybf.toString().replaceAll("\\W", "").trim();
}
/**
* 获取汉字串拼音,英文字符不变
*
* @param chinese
* 汉字串
* @return 汉语拼音
*/
public static String cn2Spell(String chinese) {
StringBuffer pybf = new StringBuffer();
char[] arr = chinese.toCharArray();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (int i = 0; i < arr.length; i++) {
if (arr[i] > 128) {
try {
String[] _t = PinyinHelper.toHanyuPinyinStringArray(arr[i],
defaultFormat);
if (_t != null) {
pybf.append(_t[0]);
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
pybf.append(arr[i]);
}
}
return pybf.toString();
}
/**
* 获取汉字串拼音,英文字符不变
*
* @param phrases
* 汉字串
* @return 汉语拼音
*/
public static List<String> getLstCn2Spell(String phrases) {
List<String> lstPY = new ArrayList<String>();
String[] arrPhrase = StringUtils.split(phrases, ",");
int charCount = 0;
for (String phrase : arrPhrase) {
charCount += phrase.length();
}
char[] arr = new char[charCount];
int arrIndex = 0;
for (String phrase : arrPhrase) {
for (int index = 0; index < phrase.length(); index++) {
arr[arrIndex++] = phrase.charAt(index);
}
}
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (int i = 0; i < arr.length; i++) {
if (arr[i] > 128) {
try {
String[] _t = PinyinHelper.toHanyuPinyinStringArray(arr[i],
defaultFormat);
if (_t != null) {
lstPY.add(_t[0]);
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
lstPY.add(String.valueOf(arr[i]));
}
}
return lstPY;
}
}
////////// Punctuation tokens to remove ////////////////
,
.
`
-
_
=
?
'
|
"
(
)
{
}
[
]
<
>
*
#
&
^
$
@
!
~
:
;
+
/
\
·
// the line below contains an IDEOGRAPHIC SPACE character (Used as a space in Chinese)
 
//////////////// English Stop Words ////////////////
//////////////// Chinese Stop Words ////////////////
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
debug="true">
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-5p - %m%n" />
</layout>
</appender>
<appender name="default_syn" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="/database/xxx_logs/newhouse-search.log"/>
<param name="append" value="true" />
<param name="encoding" value="utf-8" />
<param name="MaxFileSize" value="100MB" />
<param name="MaxBackupIndex" value="20" />
<param name="ImmediateFlush" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-5p - %m%n" />
</layout>
</appender>
<appender name="default_asyn" class="org.apache.log4j.AsyncAppender">
<param name="BufferSize" value="512" />
<appender-ref ref="default_syn" />
</appender>
<root>
<level value="debug" />
<appender-ref ref="default_asyn" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
\ No newline at end of file
newhouse.name.check.mysql.driver=com.mysql.jdbc.Driver
#newhouse.name.check.mysql.url=jdbc\:mysql\://localhost:3306/newhouse?useUnicode\=true&amp;characterEncoding\=UTF-8
newhouse.name.check.mysql.url=jdbc\:mysql\://172.17.1.200:3306/forsearch?useUnicode\=true&amp;characterEncoding\=UTF-8
newhouse.name.check.mysql.user=root
#newhouse.name.check.mysql.password=root
newhouse.name.check.mysql.password=idontcare
newhouse.name.check.dbcp2.max.idle=10
newhouse.name.check.dbcp2.min.idle=5
newhouse.name.check.dbcp2.init.size=20
newhouse.name.check.dbcp2.time.between.eviction.runs.millis=5000
newhouse.name.check.dbcp2.test.borrow=true
newhouse.name.check.dbcp2.test.return=true
newhouse.name.check.dbcp2.test.idle=true
newhouse.name.check.dbcp2.validation.query=SELECT 1
\ No newline at end of file
thread.biz.count=10
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<!--读取外部的属性文件配置参数 -->
<context:property-placeholder location="classpath:properties/*.properties" />
<!-- 自动扫描 -->
<context:component-scan base-package="com.house365.xxx" />
<bean id="newhouse.ds" class="org.apache.commons.dbcp2.BasicDataSource">
<!-- 数据库基本信息配置 -->
<property name="url" value="${newhouse.name.check.mysql.url}" />
<property name="driverClassName" value="${newhouse.name.check.mysql.driver}" />
<property name="username" value="${newhouse.name.check.mysql.user}" />
<property name="password" value="${newhouse.name.check.mysql.password}" />
<property name="maxIdle" value="${newhouse.name.check.dbcp2.max.idle}" />
<property name="minIdle" value="${newhouse.name.check.dbcp2.min.idle}" />
<property name="initialSize" value="${newhouse.name.check.dbcp2.init.size}" />
<property name="timeBetweenEvictionRunsMillis"
value="${newhouse.name.check.dbcp2.time.between.eviction.runs.millis}" />
<!-- 申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能 -->
<property name="testOnBorrow" value="${newhouse.name.check.dbcp2.test.borrow}" />
<!-- 归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能 -->
<property name="testOnReturn" value="${newhouse.name.check.dbcp2.test.return}" />
<!-- 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于 timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 -->
<property name="testWhileIdle" value="${newhouse.name.check.dbcp2.test.idle}" />
<!-- 用来检测连接是否有效的sql,要求是一个查询语句,如果validationQuery为 null,testOnBorrow、testOnReturn、testWhileIdle都不起其作用。 -->
<property name="validationQuery" value="${newhouse.name.check.dbcp2.validation.query}" />
</bean>
<!-- 刷新工作类 -->
<bean id="refreshLoaderJob" class="com.house365.xxx.newhouse.namecheck.job.RefreshLoaderJob"></bean>
<!-- 定义调用对象和调用对象的方法 -->
<bean id="refreshLoaderTask"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 调用的类 -->
<property name="targetObject">
<ref bean="refreshLoaderJob" />
</property>
<!-- 调用类中的方法 -->
<property name="targetMethod">
<value>work</value>
</property>
</bean>
<!-- 定义触发时间 -->
<bean id="refreshLoaderTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="refreshLoaderTask" />
</property>
<!-- cron表达式 -->
<property name="cronExpression">
<value>0 0 */1 * * ?</value>
</property>
</bean>
<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean id="startQuertz" lazy-init="false" autowire="no"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="refreshLoaderTrigger" />
</list>
</property>
</bean>
</beans>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>ProjectQuery</servlet-name>
<servlet-class>com.house365.xxx.newhouse.namecheck.servlet.ProjectQuery</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ProjectQuery</servlet-name>
<url-pattern>/api</url-pattern>
</servlet-mapping>
</web-app>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Lucene Search Engine Demo Client</TITLE>
<META http-equiv=Content-Type content="text/html; charset=UTF-8">
<META content="MSHTML 6.00.2800.1543" name=GENERATOR>
<style type="text/css">
<!--
body {
margin: 0;
font-family: Arial, Helvetica, sans-serif;
font-size: 0.8em;
}
td,th,div {
font-size: 0.8em;
}
a {
color: #fff;
text-decoration: none;
}
a:hover {
text-decoration: none;
}
h1 {
margin: 0px;
height: 70px;
line- height: 70px;
background: #6699CC;
color: #fff;
border-bottom: solid 1px #006699;
}
.search {
background: #ddeeff;
padding- top: 5px;
padding-bottom: 5px;
border- bottom: solid 1px #9ABBCB;
}
form {
margin: 0;
}
-->
</style>
</HEAD>
<BODY>
<CENTER>
<h1>
楼盘联想
</h1>
<div class="search">
<FORM id=searchForm action="api" method="get">
<TABLE>
<TBODY>
<TR>
<TD>
<span style="color: #6699CC; font-weight: bold;">关键词:</span>
<input type="text" size="10" name="project"
value="万科" />
<input type="text" size="5" name="city"
value="1" />
<input type="submit" value="提交" />
</TD>
</TR>
</TBODY>
</TABLE>
</FORM>
</div>
<TABLE class="result">
<TBODY>
</TBODY>
</TABLE>
</CENTER>
</BODY>
</HTML>
\ No newline at end of file
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.house365.xxx.house</groupId>
<artifactId>xxx-word-search</artifactId>
<version>1.0.0</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.house365.xxx.house</groupId>
<artifactId>house-common</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.15</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.5.6</version>
</dependency>
</dependencies>
<build>
<finalName>word-search</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
package com.house365.xxx.house.word.search;
import java.util.HashMap;
import java.util.Set;
public class CityAndDBManager {
private String newhouseDB;
private HashMap<String, String> sellCityAndDB;
public Set<String> getSellCitys() {
return sellCityAndDB.keySet();
}
public String getSellDBByCity(String city) {
return sellCityAndDB.get(city);
}
public HashMap<String, String> getSellCityAndDB() {
return sellCityAndDB;
}
public String getNewhouseDB() {
return newhouseDB;
}
public void setNewhouseDB(String newhouseDB) {
this.newhouseDB = newhouseDB;
}
public void setSellCityAndDB(HashMap<String, String> sellCityAndDB) {
this.sellCityAndDB = sellCityAndDB;
}
}
package com.house365.xxx.house.word.search;
public enum DicType {
NEWHOUSE(1), BLOCK(2), SCHOLL(3), TRAFFIC(4);
private int value;
private DicType(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
package com.house365.xxx.house.word.search.core;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.annotation.Resource;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;
import com.house365.xxx.house.word.search.dto.WordBean;
import com.house365.xxx.house.word.search.dto.WordRatio;
import com.house365.xxx.house.word.search.sell.BlockLoader;
import com.house365.xxx.house.word.search.sell.SchoolLoader;
import com.house365.xxx.house.word.search.sell.TrafficLoader;
import com.house365.xxx.house.word.search.util.PinyinToolkit;
@Component
public class DistanceChecker {
// private static Log logger = LogFactory.getLog(DistanceChecker.class);
@Resource
private BlockLoader blockLoader;
@Resource
private SchoolLoader schoolLoader;
@Resource
private TrafficLoader trafficLoader;
public void init() {
blockLoader.loadWordBeans();
schoolLoader.loadWordBeans();
trafficLoader.loadWordBeans();
}
public List<WordRatio> getWordsFromBlock(String city, String word) {
List<WordRatio> lstWR = getWordRatiosFromBlock(city, word);
Collections.sort(lstWR);
int size = 20 > lstWR.size() ? lstWR.size() : 20;
List<WordRatio> lstRS = lstWR.subList(0, size);
return lstRS;
}
public List<WordRatio> getWordsFromSell(String city, String word) {
List<WordRatio> lstWR = getWordRatiosFromBlock(city, word);
lstWR.addAll(getWordRatiosFromSchool(city, word));
lstWR.addAll(getWordRatiosFromTraffic(city, word));
Collections.sort(lstWR);
int size = 20 > lstWR.size() ? lstWR.size() : 20;
List<WordRatio> lstRS = lstWR.subList(0, size);
return lstRS;
}
private List<WordRatio> getWordRatiosFromBlock(String city, String word) {
Set<WordBean> wordBeans = blockLoader.getWordBeanByCity(city);
if (wordBeans != null && !wordBeans.isEmpty()) {
return findWordsByContains(word, wordBeans);
}
return new ArrayList<WordRatio>();
}
private List<WordRatio> getWordRatiosFromSchool(String city, String word) {
Set<WordBean> wordBeans = schoolLoader.getWordBeanByCity(city);
if (wordBeans != null && !wordBeans.isEmpty()) {
return findWordsByContains(word, wordBeans);
}
return new ArrayList<WordRatio>();
}
private List<WordRatio> getWordRatiosFromTraffic(String city, String word) {
Set<WordBean> wordBeans = trafficLoader.getWordBeanByCity(city);
if (wordBeans != null && !wordBeans.isEmpty()) {
return findWordsByContains(word, wordBeans);
}
return new ArrayList<WordRatio>();
}
public List<WordRatio> getWordsFromSellByEquals(String city, String word) {
List<WordRatio> lstWR = getWordRatiosFromBlockByEquals(city, word);
lstWR.addAll(getWordRatiosFromSchoolByEquals(city, word));
lstWR.addAll(getWordRatiosFromTrafficByEquals(city, word));
return lstWR;
}
private List<WordRatio> getWordRatiosFromBlockByEquals(String city,
String word) {
Set<WordBean> wordBeans = blockLoader.getWordBeanByCity(city);
if (wordBeans != null && !wordBeans.isEmpty()) {
return findWordsByEquals(word, wordBeans);
}
return new ArrayList<WordRatio>();
}
private List<WordRatio> getWordRatiosFromSchoolByEquals(String city,
String word) {
Set<WordBean> wordBeans = schoolLoader.getWordBeanByCity(city);
if (wordBeans != null && !wordBeans.isEmpty()) {
return findWordsByEquals(word, wordBeans);
}
return new ArrayList<WordRatio>();
}
private List<WordRatio> getWordRatiosFromTrafficByEquals(String city,
String word) {
Set<WordBean> wordBeans = trafficLoader.getWordBeanByCity(city);
if (wordBeans != null && !wordBeans.isEmpty()) {
return findWordsByEquals(word, wordBeans);
}
return new ArrayList<WordRatio>();
}
// 编辑距离计算
// private List<WordRatio> findWordsByWordDis(String word, Set<WordBean>
// dic) {
// List<WordRatio> lstRs = new ArrayList<WordRatio>();
// for (WordBean wordBean : dic) {
// float dis = 0;
// String lw = wordBean.getWord();
// float dicLen = lw.length();
// float myLen = word.length();
// dis = DistanceCalculate.getWordDistance(word, lw);
// float len = myLen > dicLen ? myLen : dicLen;
// float matchSize = len - dis;
// float matchRate = (matchSize / dicLen + matchSize / myLen) / 2;
// if (matchRate > 0.2)
// lstRs.add(new WordRatio(wordBean, matchRate));
// }
// return lstRs;
// }
public static boolean isChineseChar(String str) {
boolean temp = false;
Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
Matcher m = p.matcher(str);
if (m.find()) {
temp = true;
}
return temp;
}
private List<WordRatio> findWordsByContains(String word, Set<WordBean> dic) {
List<WordRatio> lstRs = new ArrayList<WordRatio>();
for (WordBean wordBean : dic) {
String lw = wordBean.getWord();
if (isChineseChar(word)) {
if (lw.contains(word)) {
float dicLen = lw.length();
float myLen = word.length();
float matchRate = myLen / dicLen;
lstRs.add(new WordRatio(wordBean, matchRate));
}
} else {
String dicPY = wordBean.getPinyin();
if (StringUtils.isNotBlank(dicPY)) {
String wordPY = PinyinToolkit.cn2Spell(word);
// logger.info("wordPY:" + wordPY + " dicPY:" + dicPY);
if (dicPY.startsWith(wordPY)) {
float dicLen = dicPY.length();
float myLen = wordPY.length();
float matchRate = myLen / dicLen;
lstRs.add(new WordRatio(wordBean, matchRate));
}
}
}
}
return lstRs;
}
private List<WordRatio> findWordsByEquals(String word, Set<WordBean> dic) {
List<WordRatio> lstRs = new ArrayList<WordRatio>();
for (WordBean wordBean : dic) {
String lw = wordBean.getWord();
if (lw.equalsIgnoreCase(word)) {
lstRs.add(new WordRatio(wordBean, 1.0f));
}
}
return lstRs;
}
}
package com.house365.xxx.house.word.search.db;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class MDbcpPoolHelper {
private static Log log = LogFactory.getLog(MDbcpPoolHelper.class);
private HashMap<String, BasicDataSource> mapIdDS;
public HashMap<String, BasicDataSource> getMapIdDS() {
return mapIdDS;
}
public void setMapIdDS(HashMap<String, BasicDataSource> mapIdDS) {
this.mapIdDS = mapIdDS;
}
public Connection getConn(String id) throws SQLException {
return mapIdDS.get(id).getConnection();
}
public void release(ResultSet rs, Statement st, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
if (st != null) {
try {
st.close();
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}
}
\ No newline at end of file
package com.house365.xxx.house.word.search.dto;
public class CheckResult {
private int id;
private String name;
private int type;
public CheckResult( int id,String name,int type) {
super();
this.id = id;
this.name = name;
this.type = type;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
}
package com.house365.xxx.house.word.search.dto;
import com.house365.xxx.house.word.search.DicType;
public class WordBean {
private int id;
private String word;
private String pinyin;
private DicType type;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + ((pinyin == null) ? 0 : pinyin.hashCode());
result = prime * result + ((type == null) ? 0 : type.hashCode());
result = prime * result + ((word == null) ? 0 : word.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
WordBean other = (WordBean) obj;
if (id != other.id)
return false;
if (pinyin == null) {
if (other.pinyin != null)
return false;
} else if (!pinyin.equals(other.pinyin))
return false;
if (type != other.type)
return false;
if (word == null) {
if (other.word != null)
return false;
} else if (!word.equals(other.word))
return false;
return true;
}
public WordBean(int id, String word, String pinyin, DicType type) {
super();
this.id = id;
this.word = word;
this.pinyin = pinyin;
this.type = type;
}
public WordBean(int id, String word, DicType type) {
super();
this.id = id;
this.word = word;
this.type = type;
}
public String getPinyin() {
return pinyin;
}
public void setPinyin(String pinyin) {
this.pinyin = pinyin;
}
public DicType getType() {
return type;
}
public void setType(DicType type) {
this.type = type;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
}
package com.house365.xxx.house.word.search.dto;
public class WordRatio implements Comparable<WordRatio> {
private WordBean wordBean;
private float ratio;
public WordRatio(WordBean wordBean, float ratio) {
super();
this.wordBean = wordBean;
this.ratio = ratio;
}
public WordBean getWordBean() {
return wordBean;
}
public void setWordBean(WordBean wordBean) {
this.wordBean = wordBean;
}
public float getRatio() {
return ratio;
}
public void setRatio(float ratio) {
this.ratio = ratio;
}
@Override
public int compareTo(WordRatio wordRatio) {
if (this.ratio == wordRatio.getRatio()) {
return 0;
}
return this.ratio > wordRatio.getRatio() ? -1 : 1;
}
}
package com.house365.xxx.house.word.search.job;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import com.house365.xxx.house.word.search.sell.BlockLoader;
import com.house365.xxx.house.word.search.sell.SchoolLoader;
import com.house365.xxx.house.word.search.sell.TrafficLoader;
import com.house365.xxx.house.word.search.servlet.InitServlet;
public class RefreshLoaderJob {
private static Log logger = LogFactory.getLog(RefreshLoaderJob.class);
public void work() {
logger.info("RefreshSearcherJob...");
ApplicationContext applicationContext = InitServlet
.getApplicationContext();
BlockLoader blockLoader = applicationContext.getBean(BlockLoader.class);
blockLoader.loadWordBeans();
SchoolLoader schoolLoader = applicationContext
.getBean(SchoolLoader.class);
schoolLoader.loadWordBeans();
TrafficLoader trafficLoader = applicationContext
.getBean(TrafficLoader.class);
trafficLoader.loadWordBeans();
}
}
package com.house365.xxx.house.word.search.sell;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Component;
import com.house365.xxx.house.word.search.DicType;
/**
* 二手房小区
*
* @author dzw 20151123
*
*/
@Component
public class BlockLoader extends SellLoader {
@Override
protected DicType getDicType() {
return DicType.BLOCK;
}
@Override
protected String getLoadSql() {
return "select id,blockname from block where esta=2";
}
@Override
protected Log getLogger() {
return LogFactory.getLog(BlockLoader.class);
}
}
package com.house365.xxx.house.word.search.sell;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Component;
import com.house365.xxx.house.word.search.DicType;
/**
* 学校
*
* @author dzw 20151221
*
*/
@Component
public class SchoolLoader extends SellLoader {
@Override
protected DicType getDicType() {
return DicType.SCHOLL;
}
@Override
protected String getLoadSql() {
return "select id,schoolname from school";
}
@Override
protected Log getLogger() {
return LogFactory.getLog(SchoolLoader.class);
}
}
package com.house365.xxx.house.word.search.sell;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import javax.annotation.Resource;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import com.house365.xxx.house.word.search.CityAndDBManager;
import com.house365.xxx.house.word.search.DicType;
import com.house365.xxx.house.word.search.db.MDbcpPoolHelper;
import com.house365.xxx.house.word.search.dto.WordBean;
import com.house365.xxx.house.word.search.util.PinyinToolkit;
public abstract class SellLoader {
@Resource
protected MDbcpPoolHelper dbcpPoolHelper;
@Resource
protected CityAndDBManager cityAndDB;
protected HashMap<String, Set<WordBean>> mapCityWordBean = new HashMap<String, Set<WordBean>>();
public Set<WordBean> getWordBeanByCity(String city) {
return mapCityWordBean.get(city);
}
public void loadWordBeans() {
mapCityWordBean.clear();
Set<String> citys = cityAndDB.getSellCitys();
for (String city : citys) {
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
con = dbcpPoolHelper.getConn(cityAndDB.getSellDBByCity(city));
ps = con.prepareStatement(getLoadSql());
rs = ps.executeQuery();
while (rs.next()) {
int id = rs.getInt(1);
String name = rs.getString(2);
if (StringUtils.isNotBlank(name)) {
WordBean wordBean = new WordBean(id, name,PinyinToolkit.cn2Spell(name), getDicType());
if (mapCityWordBean.containsKey(city)) {
mapCityWordBean.get(city).add(wordBean);
} else {
Set<WordBean> setWordBean = new HashSet<WordBean>();
setWordBean.add(wordBean);
mapCityWordBean.put(city, setWordBean);
}
}
}
} catch (SQLException e) {
getLogger().error(e.getMessage(), e);
} finally {
dbcpPoolHelper.release(rs, ps, con);
}
}
}
protected abstract DicType getDicType();
protected abstract String getLoadSql();
protected abstract Log getLogger();
}
package com.house365.xxx.house.word.search.sell;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Component;
import com.house365.xxx.house.word.search.DicType;
@Component
public class TrafficLoader extends SellLoader {
@Override
protected DicType getDicType() {
return DicType.TRAFFIC;
}
@Override
protected String getLoadSql() {
return "select bid,station from traffic where type=2";
}
@Override
protected Log getLogger() {
return LogFactory.getLog(TrafficLoader.class);
}
}
package com.house365.xxx.house.word.search.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import com.house365.xxx.common.config.SystemStarter;
import com.house365.xxx.house.word.search.core.DistanceChecker;
public class InitServlet extends HttpServlet {
private static final long serialVersionUID = 8225953253554733903L;
private static Log logger = LogFactory.getLog(InitServlet.class);
private static SystemStarter loader = new SystemStarter();
public void init() throws ServletException {
try {
loader.start();
ApplicationContext applicationContext = loader
.getApplicationContext();
DistanceChecker checker = applicationContext
.getBean(DistanceChecker.class);
checker.init();
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
public static SystemStarter getLoader(){
return loader;
}
public static ApplicationContext getApplicationContext(){
return loader.getApplicationContext();
}
}
package com.house365.xxx.house.word.search.servlet;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import com.alibaba.fastjson.JSON;
import com.house365.xxx.common.util.DefDocOutputDevice;
import com.house365.xxx.house.word.search.core.DistanceChecker;
import com.house365.xxx.house.word.search.dto.CheckResult;
import com.house365.xxx.house.word.search.dto.WordBean;
import com.house365.xxx.house.word.search.dto.WordRatio;
public class SellQuery extends HttpServlet {
private static final long serialVersionUID = -1204947606286376668L;
private static Log logger = LogFactory.getLog(SellQuery.class);
private static DistanceChecker checker;
public void init() throws ServletException {
ApplicationContext applicationContext = InitServlet
.getApplicationContext();
checker = applicationContext.getBean(DistanceChecker.class);
}
public void doGet(HttpServletRequest request, HttpServletResponse response) {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) {
try {
request.setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException e) {
logger.error(e.getMessage(), e);
}
String city = request.getParameter("city");
String project = request.getParameter("project").trim();
String t = request.getParameter("t");
if (StringUtils.isNotBlank(city) && StringUtils.isNotBlank(project)) {
List<WordRatio> lstWordRatio = null;
if (t!=null&&t.equals("1")) {
lstWordRatio = checker.getWordsFromSellByEquals(city, project);
} else {
lstWordRatio = checker.getWordsFromSell(city, project);
}
List<CheckResult> lstResult = new ArrayList<CheckResult>();
for (WordRatio wr : lstWordRatio) {
WordBean wb = wr.getWordBean();
lstResult.add(new CheckResult(wb.getId(), wb.getWord(), wb
.getType().getValue()));
}
DefDocOutputDevice.showJson(response, JSON.toJSONString(lstResult),
"UTF-8");
}
}
}
package com.house365.xxx.house.word.search.util;
public class DistanceCalculate {
public static int getWordDistance(String word1, String word2) {
int distance = 0;
char[] mychar1 = word1.toCharArray();
char[] mychar2 = word2.toCharArray();
int len1 = mychar1.length;
int len2 = mychar2.length;
int cost;
int boundaryx = len1 + 1;
int boundaryy = len2 + 1;
int[][] dis = new int[boundaryx][boundaryy];
for (int i = 0; i <= len1; i++)
dis[i][0] = i;
for (int j = 0; j <= len2; j++)
dis[0][j] = j;
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
if (mychar1[i - 1] == mychar2[j - 1])
cost = 0;
else
cost = 1;
dis[i][j] = getMin(dis[i - 1][j] + 1, dis[i][j - 1] + 1,
dis[i - 1][j - 1] + cost);
}
}
distance = dis[len1][len2];
return distance;
}
public static int getMin(int a, int b, int c) {
int min = a;
if (b < min)
min = b;
if (c < min)
min = c;
return min;
}
public static float getMin(float a, float b, float c) {
float min = a;
if (b < min)
min = b;
if (c < min)
min = c;
return min;
}
}
package com.house365.xxx.house.word.search.util;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
public class PinyinToolkit {
public static String lRegEx = "(a[io]?|ou?|e[inr]?|ang?|ng|[bmp](a[io]?|[aei]ng?|ei|ie?|ia[no]|o|u)|pou|me|m[io]u|[fw](a|[ae]ng?|ei|o|u)|fou|wai|[dt](a[io]?|an|e|[aeio]ng|ie?|ia[no]|ou|u[ino]?|uan)|dei|diu|[nl](a[io]?|ei?|[eio]ng|i[eu]?|i?ang?|iao|in|ou|u[eo]?|ve?|uan)|nen|lia|lun|[ghk](a[io]?|[ae]ng?|e|ong|ou|u[aino]?|uai|uang?)|[gh]ei|[jqx](i(ao?|ang?|e|ng?|ong|u)?|u[en]?|uan)|([csz]h?|r)([ae]ng?|ao|e|i|ou|u[ino]?|uan)|[csz](ai?|ong)|[csz]h(ai?|uai|uang)|zei|[sz]hua|([cz]h|r)ong|y(ao?|[ai]ng?|e|i|ong|ou|u[en]?|uan))";
public static String rRegEx = "(a[io]?|ou?|e[inr]?|ang?|ng|[bmp](a[io]?|[aei]ng?|ei|ie?|ia[no]|o|u)|pou|me|m[io]u|[fw](a|[ae]ng?|ei|o|u)|fou|wai|[dt](a[io]?|an|e|[aeio]ng|ie?|ia[no]|ou|u[ino]?|uan)|dei|diu|[nl](a[io]?|ei?|[eio]ng|i[eu]?|i?ang?|iao|in|ou|u[eo]?|ve?|uan)|nen|lia|lun|[ghk](a[io]?|[ae]ng?|e|ong|ou|u[aino]?|uai|uang?)|[gh]ei|[jqx](i(ao?|ang?|e|ng?|ong|u)?|u[en]?|uan)|([csz]h?|r)([ae]ng?|ao|e|i|ou|u[ino]?|uan)|[csz](ai?|ong)|[csz]h(ai?|uai|uang)|zei|[sz]hua|([cz]h|r)ong|y(ao?|[ai]ng?|e|i|ong|ou|u[en]?|uan))$";
public static void main(String[] args) {
System.out.println(cn2FirstSpell("文化帝景"));
String py = "suning";
System.out.println(lMatch(py));
System.out.println(rMatch(py));
}
public static List<String> lMatch(String py) {
int tag = 0;
LinkedList<String> lstPY = new LinkedList<String>();
for (int i = py.length(); i > 0; i = i - tag) {
Pattern pat = Pattern.compile(lRegEx);
Matcher matcher = pat.matcher(py);
if (matcher.find()) {
lstPY.add(matcher.group());
tag = matcher.end() - matcher.start();
py = py.substring(tag);
}else{
break;
}
}
return lstPY;
}
public static List<String> rMatch(String py) {
int tag = 0;
LinkedList<String> lstPY = new LinkedList<String>();
for (int i = py.length(); i > 0; i = tag) {
Pattern pat = Pattern.compile(rRegEx);
Matcher matcher = pat.matcher(py);
if (matcher.find()) {
lstPY.push(matcher.group());
tag = matcher.start();
py = py.substring(0, matcher.start());
}else{
break;
}
}
return lstPY;
}
// 判断查询词中是否都为字母
public static boolean judgeLetter(String query) {
query = query.toLowerCase();
char[] array = query.toCharArray();
for (int i = 0; i < array.length; i++) {
if (array[i] < 'a' || array[i] > 'z') {
return false;
}
}
return true;
}
// 判断查询是否都为汉字
public static boolean judgeHanzi(String query) {
for (int i = 0; i < query.length(); i++) {
if (!query.substring(i, i + 1).matches("[\\u4e00-\\u9fa5]+")) {
return false;
}
}
return true;
}
/**
* 获取汉字串拼音首字母,英文字符不变
*
* @param chinese
* 汉字串
* @return 汉语拼音首字母
*/
public static String cn2FirstSpell(String chinese) {
StringBuffer pybf = new StringBuffer();
char[] arr = chinese.toCharArray();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (int i = 0; i < arr.length; i++) {
if (arr[i] > 128) {
try {
String[] _t = PinyinHelper.toHanyuPinyinStringArray(arr[i],
defaultFormat);
if (_t != null) {
pybf.append(_t[0].charAt(0));
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
pybf.append(arr[i]);
}
}
return pybf.toString().replaceAll("\\W", "").trim();
}
/**
* 获取汉字串拼音,英文字符不变
*
* @param chinese
* 汉字串
* @return 汉语拼音
*/
public static String cn2Spell(String chinese) {
StringBuffer pybf = new StringBuffer();
char[] arr = chinese.toCharArray();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (int i = 0; i < arr.length; i++) {
if (arr[i] > 128) {
try {
String[] _t = PinyinHelper.toHanyuPinyinStringArray(arr[i],
defaultFormat);
if (_t != null) {
pybf.append(_t[0]);
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
pybf.append(arr[i]);
}
}
return pybf.toString();
}
/**
* 获取汉字串拼音,英文字符不变
*
* @param chinese
* 汉字串
* @return 汉语拼音
*/
public static List<String> getLstCn2Spell(String chinese) {
List<String> lstPY = new ArrayList<String>();
char[] arr = chinese.toCharArray();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (int i = 0; i < arr.length; i++) {
if (arr[i] > 128) {
try {
String[] _t = PinyinHelper.toHanyuPinyinStringArray(arr[i],
defaultFormat);
if (_t != null) {
lstPY.add(_t[0]);
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
lstPY.add(String.valueOf(arr[i]));
}
}
return lstPY;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
debug="true">
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{yyyy-MM-dd HH:mm:ss} %-5p: %m%n" />
<!-- "%-5p: [%t] [%c{3}.%M(%L)] | %m%n" -->
</layout>
</appender>
<appender name="default_syn" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="/database/xxx_logs/word-search.log"/>
<param name="append" value="true" />
<param name="encoding" value="utf-8" />
<param name="MaxFileSize" value="100MB" />
<param name="MaxBackupIndex" value="20" />
<param name="ImmediateFlush" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-5p %C - %m%n" />
</layout>
</appender>
<appender name="default_asyn" class="org.apache.log4j.AsyncAppender">
<param name="BufferSize" value="512" />
<appender-ref ref="default_syn" />
</appender>
<root>
<level value="error" />
<appender-ref ref="default_asyn" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
\ No newline at end of file
common.name.check.mysql.driver=com.mysql.jdbc.Driver
common.name.check.mysql.user=root
common.name.check.mysql.password=idontcare
common.name.check.dbcp2.max.idle=3
common.name.check.dbcp2.min.idle=1
common.name.check.dbcp2.init.size=5
common.name.check.dbcp2.time.between.eviction.runs.millis=5000
common.name.check.dbcp2.test.borrow=true
common.name.check.dbcp2.test.return=true
common.name.check.dbcp2.test.idle=true
common.name.check.dbcp2.validation.query=SELECT 1
\ No newline at end of file
njsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.131:3306/house?useUnicode\=true&amp;characterEncoding\=UTF-8
hfsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.86:3306/hf_house?useUnicode\=true&amp;characterEncoding\=UTF-8
hzsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/hz_house?useUnicode\=true&amp;characterEncoding\=UTF-8
wxsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/wx_house?useUnicode\=true&amp;characterEncoding\=UTF-8
whsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/wh_house?useUnicode\=true&amp;characterEncoding\=UTF-8
wlmqsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/wlmq_house?useUnicode\=true&amp;characterEncoding\=UTF-8
mianyangsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/mianyang_house?useUnicode\=true&amp;characterEncoding\=UTF-8
jxsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/jx_house?useUnicode\=true&amp;characterEncoding\=UTF-8
bbsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/bb_house?useUnicode\=true&amp;characterEncoding\=UTF-8
shsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/sh_house?useUnicode\=true&amp;characterEncoding\=UTF-8
cqsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/cq_house?useUnicode\=true&amp;characterEncoding\=UTF-8
ncsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/nc_house?useUnicode\=true&amp;characterEncoding\=UTF-8
aqsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/aq_house?useUnicode\=true&amp;characterEncoding\=UTF-8
bdsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/bd_house?useUnicode\=true&amp;characterEncoding\=UTF-8
ntsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/nt_house?useUnicode\=true&amp;characterEncoding\=UTF-8
szsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/sz_house?useUnicode\=true&amp;characterEncoding\=UTF-8
chuzhousell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/chuzhou_house?useUnicode\=true&amp;characterEncoding\=UTF-8
xzsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/xz_house?useUnicode\=true&amp;characterEncoding\=UTF-8
xasell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/xa_house?useUnicode\=true&amp;characterEncoding\=UTF-8
tjsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/tj_house?useUnicode\=true&amp;characterEncoding\=UTF-8
czsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/cz_house?useUnicode\=true&amp;characterEncoding\=UTF-8
cdsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/cd_house?useUnicode\=true&amp;characterEncoding\=UTF-8
sysell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/sy_house?useUnicode\=true&amp;characterEncoding\=UTF-8
lzsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/lz_house?useUnicode\=true&amp;characterEncoding\=UTF-8
hrbsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/hrb_house?useUnicode\=true&amp;characterEncoding\=UTF-8
yzsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/yz_house?useUnicode\=true&amp;characterEncoding\=UTF-8
tzsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/tz_house?useUnicode\=true&amp;characterEncoding\=UTF-8
ycsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/yc_house?useUnicode\=true&amp;characterEncoding\=UTF-8
hnsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/hn_house?useUnicode\=true&amp;characterEncoding\=UTF-8
hysell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/hy_house?useUnicode\=true&amp;characterEncoding\=UTF-8
lasell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/la_house?useUnicode\=true&amp;characterEncoding\=UTF-8
fysell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/fy_house?useUnicode\=true&amp;characterEncoding\=UTF-8
massell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/mas_house?useUnicode\=true&amp;characterEncoding\=UTF-8
zunyisell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/zunyi_house?useUnicode\=true&amp;characterEncoding\=UTF-8
xxsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/xx_house?useUnicode\=true&amp;characterEncoding\=UTF-8
yxsell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/yx_house?useUnicode\=true&amp;characterEncoding\=UTF-8
jysell.name.check.mysql.url=jdbc\:mysql\://172.17.1.54:3306/jy_house?useUnicode\=true&amp;characterEncoding\=UTF-8
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>InitServlet</servlet-name>
<servlet-class>com.house365.xxx.house.word.search.servlet.InitServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet>
<servlet-name>SellQuery</servlet-name>
<servlet-class>com.house365.xxx.house.word.search.servlet.SellQuery</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SellQuery</servlet-name>
<url-pattern>/api</url-pattern>
</servlet-mapping>
</web-app>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.house365.xxx.house</groupId>
<artifactId>xxx-word-search</artifactId>
<version>2.0.0</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.house365.xxx.house</groupId>
<artifactId>house-common</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.15</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.5.6</version>
</dependency>
</dependencies>
<build>
<finalName>word-search-2.0.0</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
package com.house365.xxx.house.word.search;
import java.util.HashMap;
import java.util.Set;
public class CityAndDBManager {
private String newhouseDB;
private HashMap<String, String> sellCityAndDB;
public Set<String> getSellCitys() {
return sellCityAndDB.keySet();
}
public String getSellDBByCity(String city) {
return sellCityAndDB.get(city);
}
public HashMap<String, String> getSellCityAndDB() {
return sellCityAndDB;
}
public String getNewhouseDB() {
return newhouseDB;
}
public void setNewhouseDB(String newhouseDB) {
this.newhouseDB = newhouseDB;
}
public void setSellCityAndDB(HashMap<String, String> sellCityAndDB) {
this.sellCityAndDB = sellCityAndDB;
}
}
package com.house365.xxx.house.word.search;
public enum DicType {
NEWHOUSE(1), BLOCK(2), SCHOLL(3), TRAFFIC(4), COMMUNITY(5), BLOCK_ALIAS(6),DISTRICT(7),STREET(8);
private int value;
private DicType(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
package com.house365.xxx.house.word.search.db;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class MDbcpPoolHelper {
private static Log log = LogFactory.getLog(MDbcpPoolHelper.class);
private HashMap<String, BasicDataSource> mapIdDS;
public HashMap<String, BasicDataSource> getMapIdDS() {
return mapIdDS;
}
public void setMapIdDS(HashMap<String, BasicDataSource> mapIdDS) {
this.mapIdDS = mapIdDS;
}
public Connection getConn(String id) throws SQLException {
return mapIdDS.get(id).getConnection();
}
public void release(ResultSet rs, Statement st, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
if (st != null) {
try {
st.close();
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}
}
\ No newline at end of file
package com.house365.xxx.house.word.search.dto;
public class CheckResult {
private int id;
private String name;
private int type;
private DistrictStreet districtStreet;
private int sellCount;
private int rentCount;
private String alias;
private String extInfo;
private String averPrice;
public CheckResult(int id, String name, int type) {
super();
this.id = id;
this.name = name;
this.type = type;
}
public CheckResult(int id, String name, int type, DistrictStreet districtStreet, int sellCount, int rentCount, String alias, String extInfo, String averPrice) {
super();
this.id = id;
this.name = name;
this.type = type;
this.districtStreet = districtStreet;
this.sellCount = sellCount;
this.rentCount = rentCount;
this.alias = alias;
this.extInfo = extInfo;
this.averPrice = averPrice;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public DistrictStreet getDistrictStreet() {
return districtStreet;
}
public void setDistrictStreet(DistrictStreet districtStreet) {
this.districtStreet = districtStreet;
}
public int getSellCount() {
return sellCount;
}
public void setSellCount(int sellCount) {
this.sellCount = sellCount;
}
public int getRentCount() {
return rentCount;
}
public void setRentCount(int rentCount) {
this.rentCount = rentCount;
}
public String getAlias() {
return alias;
}
public void setAlias(String alias) {
this.alias = alias;
}
public String getExtInfo() {
return extInfo;
}
public void setExtInfo(String extInfo) {
this.extInfo = extInfo;
}
public String getAverPrice() {
return averPrice;
}
public void setAverPrice(String averPrice) {
this.averPrice = averPrice;
}
}
package com.house365.xxx.house.word.search.dto;
/**
* 区属板块
*/
public class DistrictStreet {
/**
* 区属名称
*/
private String districtName;
/**
* 板块名称
*/
private String streetName;
public DistrictStreet(String districtName, String streetName) {
super();
this.districtName = districtName;
this.streetName = streetName;
}
public String getDistrictName() {
return districtName;
}
public void setDistrictName(String districtName) {
this.districtName = districtName;
}
public String getStreetName() {
return streetName;
}
public void setStreetName(String streetName) {
this.streetName = streetName;
}
}
package com.house365.xxx.house.word.search.dto;
import com.house365.xxx.house.word.search.DicType;
import com.house365.xxx.house.word.search.util.OrderUtil;
public class WordBean {
private int id;
private String word;
private String pinyin;
private DicType type;
private int dicOrder;
private DistrictStreet districtStreet;
private int sellCount;
private int rentCount;
private String alias;
private String extInfo;
private String averPrice;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + ((pinyin == null) ? 0 : pinyin.hashCode());
result = prime * result + ((type == null) ? 0 : type.hashCode());
result = prime * result + ((word == null) ? 0 : word.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
WordBean other = (WordBean) obj;
if (id != other.id)
return false;
if (pinyin == null) {
if (other.pinyin != null)
return false;
} else if (!pinyin.equals(other.pinyin))
return false;
if (type != other.type)
return false;
if (word == null) {
if (other.word != null)
return false;
} else if (!word.equals(other.word))
return false;
return true;
}
public WordBean(int id, String word, String pinyin, DicType type, DistrictStreet districtStreet, int sellCount, int rentCount, String alias, String extInfo, String averPrice) {
super();
this.id = id;
this.word = word;
this.pinyin = pinyin;
this.type = type;
this.districtStreet = districtStreet;
this.sellCount = sellCount;
this.rentCount = rentCount;
this.dicOrder = OrderUtil.getDicOrder(type);
this.alias = alias;
this.extInfo = extInfo;
this.averPrice = averPrice;
}
public WordBean(int id, String word, DicType type) {
super();
this.id = id;
this.word = word;
this.type = type;
}
public String getPinyin() {
return pinyin;
}
public void setPinyin(String pinyin) {
this.pinyin = pinyin;
}
public DicType getType() {
return type;
}
public void setType(DicType type) {
this.type = type;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
public DistrictStreet getDistrictStreet() {
return districtStreet;
}
public void setDistrictStreet(DistrictStreet districtStreet) {
this.districtStreet = districtStreet;
}
public int getSellCount() {
return sellCount;
}
public void setSellCount(int sellCount) {
this.sellCount = sellCount;
}
public int getRentCount() {
return rentCount;
}
public void setRentCount(int rentCount) {
this.rentCount = rentCount;
}
public int getDicOrder() {
return dicOrder;
}
public void setDicOrder(int dicOrder) {
this.dicOrder = dicOrder;
}
public String getAlias() {
return alias;
}
public void setAlias(String alias) {
this.alias = alias;
}
public String getExtInfo() {
return extInfo;
}
public void setExtInfo(String extInfo) {
this.extInfo = extInfo;
}
public String getAverPrice() {
return averPrice;
}
public void setAverPrice(String averPrice) {
this.averPrice = averPrice;
}
}
package com.house365.xxx.house.word.search.dto;
public class WordRatio implements Comparable<WordRatio> {
private WordBean wordBean;
private float ratio;
public WordRatio(WordBean wordBean, float ratio) {
super();
this.wordBean = wordBean;
this.ratio = ratio;
}
public WordBean getWordBean() {
return wordBean;
}
public void setWordBean(WordBean wordBean) {
this.wordBean = wordBean;
}
public float getRatio() {
return ratio;
}
public void setRatio(float ratio) {
this.ratio = ratio;
}
@Override
public int compareTo(WordRatio wordRatio) {
if (this.ratio == wordRatio.getRatio()) {
return 0;
}
return this.ratio > wordRatio.getRatio() ? -1 : 1;
}
}
package com.house365.xxx.house.word.search.job;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import com.house365.xxx.house.word.search.sell.BlockAliasLoader;
import com.house365.xxx.house.word.search.sell.BlockLoader;
import com.house365.xxx.house.word.search.sell.CommunityLoader;
import com.house365.xxx.house.word.search.sell.DistrictLoader;
import com.house365.xxx.house.word.search.sell.SchoolLoader;
import com.house365.xxx.house.word.search.sell.StreetLoader;
import com.house365.xxx.house.word.search.sell.TrafficLoader;
import com.house365.xxx.house.word.search.servlet.InitServlet;
import java.util.HashSet;
import java.util.Set;
@Component
public class BlockRefreshLoader {
private static Log logger = LogFactory.getLog(BlockRefreshLoader.class);
public void refreshBlock(String city) {
Set<String> citys = new HashSet<String>();
citys.add(city);
long startTime = System.currentTimeMillis();
logger.info("小区手动刷新开始,刷新城市:"+citys.toString());
ApplicationContext applicationContext = InitServlet
.getApplicationContext();
BlockLoader blockLoader = applicationContext.getBean(BlockLoader.class);
blockLoader.loadWordBeans(citys);
SchoolLoader schoolLoader = applicationContext
.getBean(SchoolLoader.class);
schoolLoader.loadWordBeans(citys);
TrafficLoader trafficLoader = applicationContext
.getBean(TrafficLoader.class);
trafficLoader.loadWordBeans(citys);
CommunityLoader communityLoader = applicationContext.getBean(CommunityLoader.class);
communityLoader.loadWordBeans(citys);
BlockAliasLoader blockAliasLoader = applicationContext.getBean(BlockAliasLoader.class);
blockAliasLoader.loadWordBeans(citys);
DistrictLoader districtLoader = applicationContext.getBean(DistrictLoader.class);
districtLoader.loadWordBeans(citys);
StreetLoader streetLoader = applicationContext.getBean(StreetLoader.class);
streetLoader.loadWordBeans(citys);
logger.info("小区手动刷新结束,耗时{"+(System.currentTimeMillis() - startTime)+"}ms");
}
}
package com.house365.xxx.house.word.search.job;
import com.house365.xxx.house.word.search.CityAndDBManager;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import com.house365.xxx.house.word.search.sell.BlockAliasLoader;
import com.house365.xxx.house.word.search.sell.BlockLoader;
import com.house365.xxx.house.word.search.sell.CommunityLoader;
import com.house365.xxx.house.word.search.sell.DistrictLoader;
import com.house365.xxx.house.word.search.sell.SchoolLoader;
import com.house365.xxx.house.word.search.sell.StreetLoader;
import com.house365.xxx.house.word.search.sell.TrafficLoader;
import com.house365.xxx.house.word.search.servlet.InitServlet;
import javax.annotation.Resource;
import java.util.Set;
public class RefreshLoaderJob {
private static Log logger = LogFactory.getLog(RefreshLoaderJob.class);
@Resource
protected CityAndDBManager cityAndDB;
public void work() {
Set<String> citys = cityAndDB.getSellCitys();
long startTime = System.currentTimeMillis();
logger.info("全量刷新任务开始,刷新城市:"+citys.toString());
ApplicationContext applicationContext = InitServlet
.getApplicationContext();
BlockLoader blockLoader = applicationContext.getBean(BlockLoader.class);
blockLoader.loadWordBeans(citys);
SchoolLoader schoolLoader = applicationContext
.getBean(SchoolLoader.class);
schoolLoader.loadWordBeans(citys);
TrafficLoader trafficLoader = applicationContext
.getBean(TrafficLoader.class);
trafficLoader.loadWordBeans(citys);
CommunityLoader communityLoader = applicationContext.getBean(CommunityLoader.class);
communityLoader.loadWordBeans(citys);
BlockAliasLoader blockAliasLoader = applicationContext.getBean(BlockAliasLoader.class);
blockAliasLoader.loadWordBeans(citys);
DistrictLoader districtLoader = applicationContext.getBean(DistrictLoader.class);
districtLoader.loadWordBeans(citys);
StreetLoader streetLoader = applicationContext.getBean(StreetLoader.class);
streetLoader.loadWordBeans(citys);
logger.info("全量刷新任务结束,耗时{"+(System.currentTimeMillis() - startTime)+"}ms");
}
}
package com.house365.xxx.house.word.search.sell;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Component;
import com.house365.xxx.house.word.search.DicType;
import com.house365.xxx.house.word.search.dto.DistrictStreet;
import com.house365.xxx.house.word.search.dto.WordBean;
import com.house365.xxx.house.word.search.util.PinyinToolkit;
/**
* 二手房小区别名
*/
@Component
public class BlockAliasLoader extends SellLoader {
@Override
protected DicType getDicType() {
return DicType.BLOCK;
}
@Override
protected String getLoadSql() {
return "SELECT\r\n" +
" t_block.id,\r\n" +
" t_block.blockname,\r\n" +
" t_block.district,\r\n" +
" t_street.streetname,\r\n" +
" ifnull(t_block_count.sellcount, 0) AS sellcount,\r\n" +
" ifnull(t_block_count.rentcount, 0) AS rentcount,\r\n" +
" t_block.alias,\r\n" +
" '' AS extinfo,\r\n" +
" t_block.averprice\r\n" +
"FROM\r\n" +
" block t_block\r\n" +
"LEFT OUTER JOIN street t_street ON t_block.streetid = t_street.id\r\n" +
"LEFT OUTER JOIN block_count t_block_count ON t_block.id = t_block_count.blockid\r\n" +
"WHERE\r\n" +
" t_block.esta = 2\r\n" +
"AND t_block.alias != ''";
}
@Override
protected Log getLogger() {
return LogFactory.getLog(BlockAliasLoader.class);
}
@Override
protected WordBean getWordBean(int id, String name, String pinyin, DicType dicType,
DistrictStreet districtStreet, int sellCount, int rentCount, String alias, String extInfo, String averPrice) {
WordBean wordBean = new WordBean(id, alias, PinyinToolkit.cn2Spell(alias), getDicType(),
districtStreet, sellCount, rentCount, name, extInfo, averPrice);
return wordBean;
}
}
package com.house365.xxx.house.word.search.sell;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Component;
import com.house365.xxx.house.word.search.DicType;
import com.house365.xxx.house.word.search.dto.DistrictStreet;
import com.house365.xxx.house.word.search.dto.WordBean;
import com.house365.xxx.house.word.search.util.PinyinToolkit;
/**
* 二手房小区
*
* @author dzw 20151123
*
*/
@Component
public class BlockLoader extends SellLoader {
@Override
protected DicType getDicType() {
return DicType.BLOCK;
}
@Override
protected String getLoadSql() {
return "SELECT\r\n" +
" t_block.id,\r\n" +
" t_block.blockname,\r\n" +
" t_block.district,\r\n" +
" t_street.streetname,\r\n" +
" ifnull(t_block_count.sellcount, 0) AS sellcount,\r\n" +
" ifnull(t_block_count.rentcount, 0) AS rentcount,\r\n" +
" t_block.alias,\r\n" +
" '' AS extinfo,\r\n" +
" t_block.averprice\r\n" +
"FROM\r\n" +
" block t_block\r\n" +
"LEFT OUTER JOIN street t_street ON t_block.streetid = t_street.id\r\n" +
"LEFT OUTER JOIN block_count t_block_count ON t_block.id = t_block_count.blockid\r\n" +
"WHERE\r\n" +
" t_block.esta = 2";
}
@Override
protected Log getLogger() {
return LogFactory.getLog(BlockLoader.class);
}
@Override
protected WordBean getWordBean(int id, String name, String pinyin, DicType dicType,
DistrictStreet districtStreet, int sellCount, int rentCount, String alias, String extInfo, String averPrice) {
WordBean wordBean = new WordBean(id, name, PinyinToolkit.cn2Spell(name), getDicType(),
districtStreet, sellCount, rentCount, alias, extInfo, averPrice);
return wordBean;
}
}
package com.house365.xxx.house.word.search.sell;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Component;
import com.house365.xxx.house.word.search.DicType;
import com.house365.xxx.house.word.search.dto.DistrictStreet;
import com.house365.xxx.house.word.search.dto.WordBean;
import com.house365.xxx.house.word.search.util.PinyinToolkit;
/**
* 二手房社区
*/
@Component
public class CommunityLoader extends SellLoader {
@Override
protected DicType getDicType() {
return DicType.COMMUNITY;
}
@Override
protected String getLoadSql() {
return "SELECT\r\n" +
" t_community.community_id,\r\n" +
" t_community.community_name,\r\n" +
" t_community.district,\r\n" +
" t_community.streetname,\r\n" +
" sum(\r\n" +
" ifnull(t_block_count.sellcount, 0)\r\n" +
" ) AS sellcount,\r\n" +
" sum(\r\n" +
" ifnull(t_block_count.rentcount, 0)\r\n" +
" ) AS rentcount,\r\n" +
" '' AS alias,\r\n" +
" '' AS extinfo,\r\n" +
" '' AS averPrice\r\n" +
"FROM\r\n" +
" (\r\n" +
" SELECT\r\n" +
" t_community.id AS community_id,\r\n" +
" t_community.community_name,\r\n" +
" t_community.district,\r\n" +
" t_street.streetname\r\n" +
" FROM\r\n" +
" community t_community\r\n" +
" LEFT OUTER JOIN street t_street ON t_community.street = t_street.id\r\n" +
" WHERE\r\n" +
" t_community. STATUS = 1\r\n" +
" ) t_community\r\n" +
"LEFT OUTER JOIN block t_block ON t_community.community_id = t_block.community_id\r\n" +
"LEFT OUTER JOIN block_count t_block_count ON t_block.id = t_block_count.blockid\r\n" +
"GROUP BY\r\n" +
" t_community.community_id,\r\n" +
" t_community.community_name,\r\n" +
" t_community.district,\r\n" +
" t_community.streetname";
}
@Override
protected Log getLogger() {
return LogFactory.getLog(CommunityLoader.class);
}
@Override
protected WordBean getWordBean(int id, String name, String pinyin, DicType dicType,
DistrictStreet districtStreet, int sellCount, int rentCount, String alias, String extInfo, String averPrice) {
WordBean wordBean = new WordBean(id, name, PinyinToolkit.cn2Spell(name), getDicType(),
districtStreet, sellCount, rentCount, alias, extInfo, averPrice);
return wordBean;
}
}
/*
* Copyright (C), 2002-2020, 江苏三六五网络股份有限公司
* FileName: DistrictLoader.java
* Author: gaoyuan
* Date: 2020年8月5日 上午10:16:51
* Description: //模块目的、功能描述
* History: //修改记录
* <author> <time> <version> <desc>
* 修改人姓名 修改时间 版本号 描述
*/
package com.house365.xxx.house.word.search.sell;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Component;
import com.house365.xxx.house.word.search.DicType;
import com.house365.xxx.house.word.search.dto.DistrictStreet;
import com.house365.xxx.house.word.search.dto.WordBean;
import com.house365.xxx.house.word.search.util.PinyinToolkit;
/**
* 二手房区属
*
* @author gaoyuan
* @version [版本号, 2020年8月5日]
* @see [相关类/方法](可选)
* @since [产品/模块版本] (可选)
*/
@Component
public class DistrictLoader extends SellLoader {
@Override
protected DicType getDicType() {
return DicType.DISTRICT;
}
@Override
protected String getLoadSql() {
return "SELECT\r\n" +
" '' AS id,\r\n" +
" t_district.`name`,\r\n" +
" t_district.`name` AS districtname,\r\n" +
" '' AS streetname,\r\n" +
" sum(\r\n" +
" ifnull(t_block_count.sellcount, 0)\r\n" +
" ) AS sellcount,\r\n" +
" sum(\r\n" +
" ifnull(t_block_count.rentcount, 0)\r\n" +
" ) AS rentcount,\r\n" +
" '' AS alias,\r\n" +
" '' AS extinfo,\r\n" +
" '' AS averPrice\r\n" +
"FROM\r\n" +
" district t_district\r\n" +
"LEFT OUTER JOIN block t_block ON t_district.`name` = t_block.district\r\n" +
"LEFT OUTER JOIN block_count t_block_count ON t_block.id = t_block_count.blockid\r\n" +
"WHERE\r\n" +
" t_block.esta = 2\r\n" +
"GROUP BY\r\n" +
" t_district.`name`";
}
@Override
protected Log getLogger() {
return LogFactory.getLog(DistrictLoader.class);
}
@Override
protected WordBean getWordBean(int id, String name, String pinyin, DicType dicType, DistrictStreet districtStreet,
int sellCount, int rentCount, String alias, String extInfo, String averPrice) {
WordBean wordBean = new WordBean(id, name, PinyinToolkit.cn2Spell(name), getDicType(), districtStreet,
sellCount, rentCount, alias, extInfo, averPrice);
return wordBean;
}
}
package com.house365.xxx.house.word.search.sell;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Component;
import com.house365.xxx.house.word.search.DicType;
import com.house365.xxx.house.word.search.dto.DistrictStreet;
import com.house365.xxx.house.word.search.dto.WordBean;
import com.house365.xxx.house.word.search.util.PinyinToolkit;
/**
* 学校
*
* @author dzw 20151221
*
*/
@Component
public class SchoolLoader extends SellLoader {
@Override
protected DicType getDicType() {
return DicType.SCHOLL;
}
@Override
protected String getLoadSql() {
return "SELECT\r\n" +
" t_school.id,\r\n" +
" t_school.schoolname,\r\n" +
" t_school.district,\r\n" +
" t_street.streetname,\r\n" +
" t_school.sellcount,\r\n" +
" t_school.rentcount,\r\n" +
" '' AS alias,\r\n" +
" '' AS extinfo,\r\n" +
" '' AS averPrice\r\n" +
"FROM\r\n" +
" (\r\n" +
" SELECT\r\n" +
" t_school.id,\r\n" +
" t_school.schoolname,\r\n" +
" t_school.district,\r\n" +
" t_school.streetid,\r\n" +
" sum(\r\n" +
" ifnull(t_block_count.sellcount, 0)\r\n" +
" ) AS sellcount,\r\n" +
" sum(\r\n" +
" ifnull(t_block_count.rentcount, 0)\r\n" +
" ) AS rentcount\r\n" +
" FROM\r\n" +
" school t_school\r\n" +
" LEFT OUTER JOIN school_block t_school_block ON t_school.id = t_school_block.school_id\r\n" +
" LEFT OUTER JOIN block_count t_block_count ON t_school_block.block_id = t_block_count.blockid\r\n" +
" GROUP BY\r\n" +
" t_school.id,\r\n" +
" t_school.schoolname,\r\n" +
" t_school.district,\r\n" +
" t_school.streetid\r\n" +
" ) t_school\r\n" +
"LEFT OUTER JOIN street t_street ON t_school.streetid = t_street.id";
}
@Override
protected Log getLogger() {
return LogFactory.getLog(SchoolLoader.class);
}
@Override
protected WordBean getWordBean(int id, String name, String pinyin, DicType dicType,
DistrictStreet districtStreet, int sellCount, int rentCount, String alias, String extInfo, String averPrice) {
WordBean wordBean = new WordBean(id, name, PinyinToolkit.cn2Spell(name), getDicType(),
districtStreet, sellCount, rentCount, alias, extInfo, averPrice);
return wordBean;
}
}
package com.house365.xxx.house.word.search.sell;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import javax.annotation.Resource;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import com.house365.xxx.house.word.search.CityAndDBManager;
import com.house365.xxx.house.word.search.DicType;
import com.house365.xxx.house.word.search.db.MDbcpPoolHelper;
import com.house365.xxx.house.word.search.dto.DistrictStreet;
import com.house365.xxx.house.word.search.dto.WordBean;
import com.house365.xxx.house.word.search.util.PinyinToolkit;
public abstract class SellLoader {
@Resource
protected MDbcpPoolHelper dbcpPoolHelper;
@Resource
protected CityAndDBManager cityAndDB;
protected HashMap<String, Set<WordBean>> mapCityWordBean = new HashMap<String, Set<WordBean>>();
public Set<WordBean> getWordBeanByCity(String city) {
return mapCityWordBean.get(city);
}
public void loadWordBeans(Set<String> citys) {
for (String city : citys) {
mapCityWordBean.remove(city);
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
con = dbcpPoolHelper.getConn(cityAndDB.getSellDBByCity(city));
ps = con.prepareStatement(getLoadSql());
rs = ps.executeQuery();
while (rs.next()) {
int id = rs.getInt(1);
String name = rs.getString(2);
String districtname = rs.getString(3);
String streetname = rs.getString(4);
DistrictStreet districtStreet = new DistrictStreet(districtname, streetname);
int sellCount = rs.getInt(5);
int rentCount = rs.getInt(6);
String alias = rs.getString(7);
String extInfo = rs.getString(8);
String averPrice = rs.getString(9);
if (StringUtils.isNotBlank(name)) {
WordBean wordBean = getWordBean(id, name, PinyinToolkit.cn2Spell(name), getDicType(), districtStreet, sellCount, rentCount, alias, extInfo, averPrice);
if (mapCityWordBean.containsKey(city)) {
mapCityWordBean.get(city).add(wordBean);
} else {
Set<WordBean> setWordBean = new HashSet<WordBean>();
setWordBean.add(wordBean);
mapCityWordBean.put(city, setWordBean);
}
}
}
} catch (SQLException e) {
getLogger().error("context city="+city);
getLogger().error(e.getMessage(), e);
} finally {
dbcpPoolHelper.release(rs, ps, con);
}
}
}
protected abstract DicType getDicType();
protected abstract String getLoadSql();
protected abstract Log getLogger();
protected abstract WordBean getWordBean(int id, String name, String pinyin, DicType dicType,
DistrictStreet districtStreet, int sellCount, int rentCount, String alias, String extInfo, String averPrice);
}
/*
* Copyright (C), 2002-2020, 江苏三六五网络股份有限公司
* FileName: StreetLoader.java
* Author: gaoyuan
* Date: 2020年8月5日 上午10:19:25
* Description: //模块目的、功能描述
* History: //修改记录
* <author> <time> <version> <desc>
* 修改人姓名 修改时间 版本号 描述
*/
package com.house365.xxx.house.word.search.sell;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Component;
import com.house365.xxx.house.word.search.DicType;
import com.house365.xxx.house.word.search.dto.DistrictStreet;
import com.house365.xxx.house.word.search.dto.WordBean;
import com.house365.xxx.house.word.search.util.PinyinToolkit;
/**
* 二手房商圈
*
* @author gaoyuan
* @version [版本号, 2020年8月5日]
* @see [相关类/方法](可选)
* @since [产品/模块版本] (可选)
*/
@Component
public class StreetLoader extends SellLoader {
@Override
protected DicType getDicType() {
return DicType.STREET;
}
@Override
protected String getLoadSql() {
return "SELECT\r\n" +
" t_street.id,\r\n" +
" t_street.streetname AS NAME,\r\n" +
" t_street.district AS districtname,\r\n" +
" t_street.streetname AS streetname,\r\n" +
" sum(\r\n" +
" ifnull(t_block_count.sellcount, 0)\r\n" +
" ) AS sellcount,\r\n" +
" sum(\r\n" +
" ifnull(t_block_count.rentcount, 0)\r\n" +
" ) AS rentcount,\r\n" +
" '' AS alias,\r\n" +
" '' AS extinfo,\r\n" +
" '' AS averPrice\r\n" +
"FROM\r\n" +
" street t_street\r\n" +
"LEFT OUTER JOIN block t_block ON t_street.id = t_block.streetid\r\n" +
"LEFT OUTER JOIN block_count t_block_count ON t_block.id = t_block_count.blockid\r\n" +
"WHERE\r\n" +
" t_block.esta = 2\r\n" +
"GROUP BY\r\n" +
" t_street.id,\r\n" +
" t_street.streetname";
}
@Override
protected Log getLogger() {
return LogFactory.getLog(StreetLoader.class);
}
@Override
protected WordBean getWordBean(int id, String name, String pinyin, DicType dicType, DistrictStreet districtStreet,
int sellCount, int rentCount, String alias, String extInfo, String averPrice) {
WordBean wordBean = new WordBean(id, name, PinyinToolkit.cn2Spell(name), getDicType(), districtStreet,
sellCount, rentCount, alias, extInfo, averPrice);
return wordBean;
}
}
This diff is collapsed.
common.name.check.mysql.driver=com.mysql.jdbc.Driver
common.name.check.mysql.user=root
common.name.check.mysql.password=idontcare
common.name.check.dbcp2.max.idle=3
common.name.check.dbcp2.min.idle=1
common.name.check.dbcp2.init.size=5
common.name.check.dbcp2.time.between.eviction.runs.millis=5000
common.name.check.dbcp2.test.borrow=true
common.name.check.dbcp2.test.return=true
common.name.check.dbcp2.test.idle=true
common.name.check.dbcp2.validation.query=SELECT 1
\ No newline at end of file
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment