測試環境:Mac+JDK1.6java
測試工具:eclipse4.3,mysqlmysql
lucene版本:lucene4.0sql
主要Jar包:ant- 1.8.2.jar、junit-4.10.jar、junit4-ant-2.0.1.jar、lucene-analyzers-common- 4.0.0.jar、lucene-codecs-4.0.0.jar、lucene-core-4.0.0.jar數據庫
lucene- join-4.0.0.jar、lucene-memory-4.0.0.jar、lucene-queries-4.0.0.jar、lucene- queryparser-4.0.0.jar、lucene-test-framework-4.0.0.jardom
mysql-connector-java-5.1.19-bin.jar、randomizedtesting-runner-2.0.1.jareclipse
1)新建Java工程:建立對象實體類——User工具
/**單元測試
* 實體對象測試
* @author zzgthis
*
*/
public class User {
private Integer userId;
private String rpsId;
private String userType;
private Integer personId;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getRpsId() {
return rpsId;
}
public void setRpsId(String rpsId) {
this.rpsId = rpsId;
}
public String getUserType() {
return userType;
}
public void setUserType(String userType) {
this.userType = userType;
}
public Integer getPersonId() {
return personId;
}
public void setPersonId(Integer personId) {
this.personId = personId;
}
}
/**
* 連接數據源
* @author zzg
*
*/
public class DBSource {
private String password="數據庫祕密";
private String url="jdbc:mysql://數據庫ip:端口/數據庫名稱?autoReconnect=true&characterEncoding=utf8";
private String userName="登陸名";
private static final String JDBC_DRIVER="com.mysql.jdbc.Driver";
private Statement st;
private Connection conn;
private ResultSet rs;
/**
* 內部類得到數據源對象
*/
private static class DBInstance{
public final static DBSource instance= new DBSource();
}
public static DBSource getInstance(){
return DBInstance.instance;
}
/**
*鏈接數據庫
*/
public Connection getConn(){
try {
Class.forName(JDBC_DRIVER);
conn=DriverManager.getConnection(url,userName,password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/**
* 建立執行SQL
*/
public Statement getStm(){
conn = getConn();
try {
st=conn.createStatement();
return st;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 返回結果集
*/
public ResultSet getResult(String sql){
st=getStm();
try {
rs=st.executeQuery(sql);
return rs;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 處理關閉按鈕
*/
public void close(){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(st!=null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
/**
* lucene核心測試處理方法
* @author zzg
*
*/
public class LuceneUtil {
public static final String INDEX_DIRECTORY = "/Users/zzg/Documents/workspace/luceneDir";
public static final String WRITE_LOCK_NAME="write.lock";
//private static Analyzer analyzer = new IK_CAnalyzer();
private static StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_40);
/**
* 建立索引庫
*/
@SuppressWarnings("deprecation")
public void createIndex(){
try {
//true 表示每此都建立一個新的文件夾,false表示每次都覆蓋
FSDirectory dir = FSDirectory.open(new File(INDEX_DIRECTORY));
IndexWriterConfig config =new IndexWriterConfig(Version.LUCENE_40, analyzer);
IndexWriter indexWriter=new IndexWriter(dir, config);
DBSource dbSource = DBSource.getInstance();
//DBSource dbSource = new DBSource();
Connection conn=dbSource.getConn();
Statement stm = null;
ResultSet rs = null;
String sql="select user_id,rps_id,user_type,person_id from 表名";
stm=dbSource.getStm();
rs=dbSource.getResult(sql);
List<User> list = new ArrayList<User>();
try {
while(rs.next()){
User user = new User();
user.setUserId(rs.getInt(1));
user.setRpsId(rs.getString(2));
user.setUserType(rs.getString(3));
user.setPersonId(rs.getInt(4));
list.add(user);
}
System.out.println("總記錄條數:"+list.size());
for (int i = 0; i < list.size(); i++) {
//建立一個lucene索引
Document document = new Document();
String userId=list.get(i).getUserId().toString();
String rpsId=list.get(i).getRpsId();
String userType=list.get(i).getUserType();
String personId=list.get(i).getPersonId().toString();
//將用戶ID添加到索引文件中並高亮顯示
document.add(new Field("userId" , userId , Field.Store.YES , Field.Index.ANALYZED , Field.TermVector.WITH_POSITIONS_OFFSETS));
document.add(new Field("rpsId" , rpsId , Field.Store.YES , Field.Index.ANALYZED , Field.TermVector.WITH_POSITIONS_OFFSETS));
document.add(new Field("userType" , userType , Field.Store.YES , Field.Index.ANALYZED , Field.TermVector.WITH_POSITIONS_OFFSETS));
document.add(new Field("personId" , personId , Field.Store.YES , Field.Index.ANALYZED , Field.TermVector.WITH_POSITIONS_OFFSETS));
//document.add(new Field("rpsId" , rpsId , Field.Store.YES , Field.Index.ANALYZED , Field.TermVector.WITH_POSITIONS_OFFSETS));
indexWriter.addDocument(document);
}
//System.out.println(list.size());
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
indexWriter.close();
dbSource.close();
if(IndexWriter.isLocked(dir)){
dir.makeLock(WRITE_LOCK_NAME);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 索引查詢
*/
public List<PO> searcheFile(String keyword) throws IOException, ParseException{
Date startTime= new Date(System.currentTimeMillis());
System.out.println("開始時間:"+getDate(startTime));
Directory ireader = FSDirectory.open(new File(INDEX_DIRECTORY));
//System.out.println(iread);
System.out.println();
IndexReader reader = DirectoryReader.open(ireader);
IndexSearcher searcher=new IndexSearcher(reader);
QueryParser parser = new QueryParser(Version.LUCENE_40, "userType", analyzer);
Query query = parser.parse(keyword);
TopScoreDocCollector topScoreDocCollector = TopScoreDocCollector.create(100, true);
searcher.search(query, topScoreDocCollector);
//處理返回結果集
ScoreDoc[] docs = topScoreDocCollector.topDocs().scoreDocs;
System.out.println("總記錄數:"+topScoreDocCollector.getTotalHits());
for (int i = 0; i < docs.length; i++) {
//ScoreDoc scoreDoc = hits[i];
Document result = searcher.doc(docs[i].doc);
}
Date endTime= new Date(System.currentTimeMillis());
System.out.println("結束時間:"+getDate(endTime));
System.out.println("經過lucene索引查詢總計用時:"+(endTime.getTime()-startTime.getTime()));
System.out.println("================================================================");
reader.close();
return null;
}
/**
* 經過sql語句查詢
*/
public void searchBySql(String columName,Object value){
DBSource dbSource = DBSource.getInstance();
//DBSource dbSource = new DBSource();
Connection conn=dbSource.getConn();
Statement stm = null;
ResultSet rs = null;
String sql="select user_id,rps_id,user_type,person_id from linksus_relation_weibouser where "+columName+"="+value;
stm=dbSource.getStm();
Date startTime=new Date();
System.out.println(getDate(startTime));
rs=dbSource.getResult(sql);
List<User> list = new ArrayList<User>();
try {
while(rs.next()){
User user = new User();
user.setUserId(rs.getInt(1));
user.setRpsId(rs.getString(2));
user.setUserType(rs.getString(3));
user.setPersonId(rs.getInt(4));
list.add(user);
}
System.out.println("總記錄條數:"+list.size());
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
dbSource.close();
}
Date endTime=new Date();
System.out.println(getDate(endTime));
System.out.println("經過sql語句直接查詢總計用時:"+(endTime.getTime()-startTime.getTime()));
}
/**
* 時間格式化處理
*/
public String getDate(Date time){
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-ss hh:mm:ss ssss");
String dateStr=dateFormat.format(time);
return dateStr;
};
}
4)測試類——Junit 單元測試
測試user_type=1或2
public class Test {
@org.junit.Test
public void testIndex() throws IOException, ParseException{
LuceneUtil lu = new LuceneUtil();
//建立索引
//lu.createIndex();
//經過索引查詢user_type=1的數據
lu.searcheFile("1");
//經過直接查詢數據庫查詢user_type=1的數據
lu.searchBySql("user_type",1);
}
}
測試結果:
user_type |
lucene索引查詢 |
sql直接查詢 |
---|---|---|
1 | 總記錄數:174448 用時:637~545毫秒 |
總記錄數:174448 用時:2966~2035毫秒 |
2 | 總記錄數:27996 用時:601~565毫秒 |
總記錄數:27996 用時:1228~745毫秒 |