lucene检索数据库并查询
2008-12-11 10:05
218 查看
下面的程序用的是:lucene- 2.0.0 数据库是:mysql
实现功能:为数据库建立索引,输入一个查询,就可以得到相应内容,有点类似SQL语句,此程序只供练习用。
数据库字段有:id name age 当输入一个人的姓名后,可以得到相应的其id和age
源代码如下:
package test;
import java.awt.List;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.sql.*;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.Query;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.*;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.TermPositionVector;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.RAMDirectory;
import jeasy.analysis.MMAnalyzer;
public class TestLucene {
private static ResultSet recrd;
static MMAnalyzer analyzer=new MMAnalyzer();
/**
* @param args
*/
public static void main(String[] args) {
// MMAnalyzer analyzer=new MMAnalyzer();
try {
File indexpath= new File("F://罗勋发的//");
IndexWriter writer=new IndexWriter(indexpath,
analyzer,true);
recrd=getConn(); //获取数据库的记录集
// while (recrd.next()) {
// System.out.println(recrd.getString(1));
//
// }
IndexBuilder(writer); //建立索引
BufferedReader bReader= new BufferedReader(new InputStreamReader(System.in));
String query=bReader.readLine();
// System.out.println(query);
Hits hits= search(query); //输入查询内容后,查询
for(int i=0;i<hits.length();i++){ //返回查询后结果
Document document=hits.doc(i);
System.out.println(document.get("ID"));
System.out.println(document.get("Name"));
System.out.println(document.get("age"));
}
} catch (Exception e) {
// TODO: handle exception
}
}
public static Hits search(String quString){ //搜索用户输入的字符
Hits hits=null;
try {
IndexSearcher iSearcher = new IndexSearcher("F://罗勋发的//");
QueryParser parser=new QueryParser("Name",analyzer);
Query query=parser.parse(quString);
// System.out.println(query.toString());
hits=iSearcher.search(query);
return hits;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static void IndexBuilder(IndexWriter fWriter) throws Exception{ //建立索引
while(recrd.next()){
Directory ramDirectory=new RAMDirectory();
IndexWriter ramWriter=new IndexWriter(ramDirectory,
new StandardAnalyzer(),true);
Document document=new Document();
Field id= new Field("ID",recrd.getString("ID"),Field.Store.YES,
Field.Index.TOKENIZED);
Field name=new Field("Name",recrd.getString("Name"),Field.Store.YES,
Field.Index.TOKENIZED);
Field age=new Field("age",recrd.getString("age"),Field.Store.YES,
Field.Index.TOKENIZED);
document.add(id);
document.add(name);
document.add(age);
ramWriter.addDocument(document);
ramWriter.close();
fWriter.addIndexes(new Directory[]{ramDirectory});
}
}
public static ResultSet getConn() { //建立数据库连接,并返回结果
try {
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/test";
Connection conn = DriverManager.getConnection(url, "root", "alen");
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql = "select * from student";
ResultSet rs = stmt.executeQuery(sql);
return rs;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
如输入:alen
结果:1
alen
18
当然结果输出,你可以在下面代码控制:
for(int i=0;i<hits.length();i++){ //返回查询后结果
Document document=hits.doc(i);
System.out.println(document.get("ID"));
System.out.println(document.get("Name"));
System.out.println(document.get("age"));
}
实现功能:为数据库建立索引,输入一个查询,就可以得到相应内容,有点类似SQL语句,此程序只供练习用。
数据库字段有:id name age 当输入一个人的姓名后,可以得到相应的其id和age
源代码如下:
package test;
import java.awt.List;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.sql.*;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.Query;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.*;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.TermPositionVector;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.RAMDirectory;
import jeasy.analysis.MMAnalyzer;
public class TestLucene {
private static ResultSet recrd;
static MMAnalyzer analyzer=new MMAnalyzer();
/**
* @param args
*/
public static void main(String[] args) {
// MMAnalyzer analyzer=new MMAnalyzer();
try {
File indexpath= new File("F://罗勋发的//");
IndexWriter writer=new IndexWriter(indexpath,
analyzer,true);
recrd=getConn(); //获取数据库的记录集
// while (recrd.next()) {
// System.out.println(recrd.getString(1));
//
// }
IndexBuilder(writer); //建立索引
BufferedReader bReader= new BufferedReader(new InputStreamReader(System.in));
String query=bReader.readLine();
// System.out.println(query);
Hits hits= search(query); //输入查询内容后,查询
for(int i=0;i<hits.length();i++){ //返回查询后结果
Document document=hits.doc(i);
System.out.println(document.get("ID"));
System.out.println(document.get("Name"));
System.out.println(document.get("age"));
}
} catch (Exception e) {
// TODO: handle exception
}
}
public static Hits search(String quString){ //搜索用户输入的字符
Hits hits=null;
try {
IndexSearcher iSearcher = new IndexSearcher("F://罗勋发的//");
QueryParser parser=new QueryParser("Name",analyzer);
Query query=parser.parse(quString);
// System.out.println(query.toString());
hits=iSearcher.search(query);
return hits;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static void IndexBuilder(IndexWriter fWriter) throws Exception{ //建立索引
while(recrd.next()){
Directory ramDirectory=new RAMDirectory();
IndexWriter ramWriter=new IndexWriter(ramDirectory,
new StandardAnalyzer(),true);
Document document=new Document();
Field id= new Field("ID",recrd.getString("ID"),Field.Store.YES,
Field.Index.TOKENIZED);
Field name=new Field("Name",recrd.getString("Name"),Field.Store.YES,
Field.Index.TOKENIZED);
Field age=new Field("age",recrd.getString("age"),Field.Store.YES,
Field.Index.TOKENIZED);
document.add(id);
document.add(name);
document.add(age);
ramWriter.addDocument(document);
ramWriter.close();
fWriter.addIndexes(new Directory[]{ramDirectory});
}
}
public static ResultSet getConn() { //建立数据库连接,并返回结果
try {
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/test";
Connection conn = DriverManager.getConnection(url, "root", "alen");
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql = "select * from student";
ResultSet rs = stmt.executeQuery(sql);
return rs;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
如输入:alen
结果:1
alen
18
当然结果输出,你可以在下面代码控制:
for(int i=0;i<hits.length();i++){ //返回查询后结果
Document document=hits.doc(i);
System.out.println(document.get("ID"));
System.out.println(document.get("Name"));
System.out.println(document.get("age"));
}
相关文章推荐
- lucene学习六:lucene全文检索与数据库查询的比较
- Lucene4.10.4实践 索引联合查询数据库实现查询更快
- Delphi数据库的拼音检索(查询)方案-汉字转换成拼音
- lucene3.6分页、自定义查询的数据库实现
- 全文检索之lucene的优化篇--查询篇
- 用Lucene检索数据库
- JAVAWEB开发之Lucene详解——Lucene入门及使用场景、全文检索、索引CRUD、优化索引库、分词器、高亮、相关度排序、各种查询
- JAVA_WEB项目之Lucene实现检索结果排序和关键字在索引库中多字段查询结果进行高亮显示
- lucene全文检索与数据库检索的区别
- J2EE项目系列(四)--SSM框架构建积分系统和基本商品检索系统(Spring+SpringMVC+MyBatis+Lucene+Redis+MAVEN)(2)建立商品数据库和Lucene的搭建
- 【转载】51CTO-Android全文检索FTS来提高数据库查询速度
- dotlucene多条件检索数据库
- Lucene.Net, SQL Server 2008全文检索, Like模糊查询的一点心得
- Delphi数据库的拼音检索(查询)方案-汉字转换成拼音
- Lucene:实现数据库的全文检索
- Lucene.Net, SQL Server 2008全文检索, Like模糊查询的一点心得(转)
- lucene检索,按词语比重查询
- lucene全文检索多种查询检索简单案例
- 有关数据库查询时,检索词末尾带有空格
- 基于倒排索引的关系数据库全文检索查询效率研究