一.建立查询对象的索引;
IndexSqlCreator.java
import java.util.Iterator;
import java.util.List;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexWriter;
public class IndexSqlCreator
{
//建立索引的根目录,使用XML或Properties文件配置;
private static final String INDEX_PATH="sqlindex";
/** *//**
* @param args
*/
public void createIndex()
{
try
{
//建立索引,定义解析器;
IndexWriter iw = new IndexWriter(IndexSqlCreator.INDEX_PATH,
new StandardAnalyzer(), true);
//获得
List l = SqlDocument.getDoc();
for (Iterator it = l.iterator(); it.hasNext();)
{
iw.addDocument((Document) it.next());
}
iw.optimize();
iw.close();
} catch (Exception e)
{
e.printStackTrace();
}
}
}
SqlDocument.java
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import net.sf.hibernate.Query;
import net.sf.hibernate.Session;
public class SqlDocument
{
private static final Logger logger =Logger.getLogger(SqlDocument.class);
public static List getDoc()
{
List l_r=new ArrayList();
try
{
/**//*
* 以数据库中内容为数据源建立索引;
*/
Session session = HibernateUtil.currentSession();
Query query = session
.createQuery("from cn.neto.lyf.User as ui where ui.username like ?");
query.setString(0, "%za%");
List ql = query.list();
/** *//**
* 遍历所有数据源生成索引文档;
* 可以使用任意数据,如文件,文档作为数据源;
*/
for(Iterator it=ql.iterator();it.hasNext();)
{
User item=(User)it.next();
Document doc=new Document();
//不需要建立索引的字段,一般为表的主键;
doc.add(new Field("id",item.getUserid().toString(),Field.Store.YES,Field.Index.NO));;
//需要建立索引的字段,一般为需要查询的内容;
doc.add(new Field("password",item.getPassword(),Field.Store.YES,Field.Index.UN_TOKENIZED));
doc.add(new Field("username",item.getUsername(),Field.Store.YES,Field.Index.UN_TOKENIZED));
//如果字段中包含中文,使用Field.Index.TOKENIZED;
doc.add(new Field("realname",item.getRealname(),Field.Store.YES,Field.Index.TOKENIZED));
doc.add(new Field("position",item.getPosition(),Field.Store.YES,Field.Index.NO));
l_r.add(doc);
}
} catch (Exception e)
{
logger.error("ERROR",e.fillInStackTrace());
e.printStackTrace();
}
return l_r;
}
}
二.查询内容:
SearchDemo.java
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Searcher;
public class SearchDemo
{
public static void main(String[] args)
{
try
{
Searcher ss = new IndexSearcher("sqlindex");
Analyzer aa = new StandardAnalyzer();
BufferedReader r = new BufferedReader(new InputStreamReader(
System.in));
while (true)
{
System.out.print("Query :");
String name = r.readLine();
if (name.toLowerCase().equals("exit"))//退出标志
{
System.exit(-1);
} else
{
//建立查询分析器,确定分析的关键字'realname';
QueryParser qp = new QueryParser("realname", aa);
Query q=qp.parse(name);
System.out.println("[statment]:" + q.toString("realname"));
Hits hits = ss.search(q);
final int HIT_PAGE = 10;
System.out.println(hits.length()+ " result!");
for (int i = 0; i < hits.length(); i += HIT_PAGE)//遍历收缩结果
{
int end = Math.min(hits.length(), i + HIT_PAGE);
for (int l = i; l < end; l++)
{
Document doc = hits.doc(l);
System.out.println(l + "::" + doc.get("username"));
System.out.println(doc.get("password"));
System.out.println(doc.get("realname"));
System.out.println(doc.get("position"));
}
if (hits.length() > end)
{
System.out.print("more y/n?");
String flag = r.readLine();
if (flag.toLowerCase().equals("n"))
{
break;
}
if (flag.toLowerCase().equals("y"))
{
continue;
} else
break;
}
}
}
}
} catch (Exception e)
{
e.printStackTrace();
}
}
}
浙公网安备 33010602011771号