|
|
为了在没有数据库支持的情况下,完成多个属性数据的检索任务,特地在代码中加入了鼎鼎大名的Apache.Lucene。当然让lucene来干这个是大材小用了一点。 Lucene的工作流程主要是: 1 使用IndexWriter,在指定的目录建立索引的文件 2 将需要检索的数据转换位Document的Filed对象,然后将Document用IndexWriter添加倒索引的文件中 3 处理索引信息,关闭IndexWriter流 4 创建搜索的Query 5 给IndexSearcher指定索引文件的路径后,用Query检索后返回Hits对象作为结果 样例代码: -
- //sample code,索引对象
- public class PersonInfo {
- public String firstName="";
- public String lastName="";
- public String IDNumber="";
- }
- //Lucene 的添加和更新索引
- public class LuceneSearcher {
- public void addPersionInfo(PersonInfo person) {
- Document doc = new Document();
- doc.add(Field.Keyword("FirstName",person.getFirstName()));
- doc.add(Field.Keyword("IDNumber",person.getIDNumber()));
- doc.add(Field.Keyword("LastName",person.getLastName()));
- doc.add(Field.Text("content",person.getIDNumber()));
- try{
- //删除旧的相同的索引
- this.remove(person.getIDNumber());
- writer = new IndexWriter(directory, new StandardAnalyzer(), false);
- writer.addDocument(doc);
- writer.optimize();
- writer.close();
- }
- catch(IOException ioe) {
- ioe.printStackTrace();
- }
- }
- //删除旧的索引,idNumber作为Person的PK,建立term后删除
- public void remove(String idNumber) {
- try{
- IndexReader reader = IndexReader.open(directory);
- Term term = new Term("IDNumber",idNumber);
- reader.delete(term);
- reader.close();
- }
- catch(IOException ioe) {
- ioe.printStackTrace();
- }
- }
- //search 代码片段
- public String[] search(String query) {
- //建立search对象
- Searcher searcher = new IndexSearcher(directory);
- //解析输入的Query [FirstName: "gerald" AND LastName:"zhou" AND IDNumber:"10*"]
- Query query = QueryParser.parse(line, "FirstName", new StandardAnalyzer());
- Hits hits = searcher.search(query);
-
---------------------------------------------------------------------------------------- 这样就可以简单的用lucene来完成对person对象的firstName,lastName和IDNumber3个属性的综合查询功能了,只要按照[url=http://jakarta.apache.org/lucene/docs/queryparsersyntax.html]Lucene Query[/url]语法就可以了 需要注意的还有以下几点 1 IndexWriter在添加新的document后,需要重新建立Index,则需要调用writer.optimize();方法 2 Lucene没有update索引的方法,需要删除后重新建立,参考remove方法 3 用IndexReader删除Document后,需要重新用IndexWriter进行整理,否则无法在进行搜索(不知道是不是我设置问题) 休息!休息,今天就到这里了!! |
|