LUCENE入门

来源:互联网 发布:软件开发招标网 编辑:程序博客网 时间:2024/05/21 06:46

第一阶段:

1.建立普通POJO类

package com.citi.test.lucence;

public class User {

 private int id;

 private String firstName;

 private String lastName;
 
 public User(){
  
 }
 
 public User(int id, String firstName, String lastName) {

  this.id = id;

  this.firstName = firstName;

  this.lastName = lastName;
 }

 public int getId() {
  return id;
 }

 public void setId(int id) {
  this.id = id;
 }

 public String getFirstName() {
  return firstName;
 }

 public void setFirstName(String firstName) {
  this.firstName = firstName;
 }

 public String getLastName() {
  return lastName;
 }

 public void setLastName(String lastName) {
  this.lastName = lastName;
 }

}
2.建立索引,以及查询方法

package com.citi.test.lucence;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.util.Version;

public class UserSearch {

 private static final File INDEX_DIR = new File("e:\\lucene\\index");

 private Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);

 public void createIndex(List<User> list) throws CorruptIndexException,
   LockObtainFailedException, IOException {

  IndexWriter writer = openWriter();

  try {

   for (User user : list) {

    Document document = buildDocument(user);

    writer.addDocument(document);
   }
  } finally {

   writer.close();
  }
 }

 private IndexWriter openWriter() throws CorruptIndexException,
   LockObtainFailedException, IOException {

  IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_35,
    analyzer);

  iwc.setOpenMode(OpenMode.CREATE);

  return new IndexWriter(FSDirectory.open(INDEX_DIR), iwc);
 }

 private Document buildDocument(User user) {

  Document document = new Document();

  Field id = new Field("id", String.valueOf(user.getId()),
    Field.Store.YES, Field.Index.ANALYZED);
  Field lastName = new Field("lastName", user.getLastName(),
    Field.Store.YES, Field.Index.ANALYZED);
  Field firstName = new Field("firstName", user.getFirstName(),
    Field.Store.YES, Field.Index.ANALYZED);

  document.add(firstName);
  document.add(lastName);
  document.add(id);

  return document;
 }

 

 public List search(String fieldName, String criteria)
   throws CorruptIndexException, IOException, ParseException {

  IndexReader reader = IndexReader.open(FSDirectory.open(INDEX_DIR));

  IndexSearcher searcher = new IndexSearcher(reader);

  List<User> list = new ArrayList<User>();

  try {

   Query query = buildQuery(fieldName, criteria);

   TopDocs topDocs = searcher.search(query, 10);

   int total = topDocs.totalHits;

   System.out.println("total =" + total);
   
   ScoreDoc[] scoreDocs = topDocs.scoreDocs;
   
   for(int i = 0;i<scoreDocs.length;i++){
    
    Document doc = searcher.doc(scoreDocs[i].doc);
    
    User user = new User();
    
    user.setId(Integer.valueOf(doc.get("id")));
    
    user.setFirstName(doc.get("firstName"));
    
    user.setLastName(doc.get("lastName"));
    
    list.add(user);
   }
   
  } finally {

   reader.clone();
  }
  return list;
 }

 private Query buildQuery(String fieldName, String criteria)
   throws ParseException {

  QueryParser parser = new QueryParser(Version.LUCENE_35, fieldName,
    analyzer);

  return parser.parse(criteria);
 }
}
3.主函数入口

package com.citi.test.lucence;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.store.LockObtainFailedException;

public class UserRun {

 public static void main(String[] args) {

  UserRun.init();

  try {
   UserRun.search();
  } catch (CorruptIndexException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (ParseException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

 public static void init() {

  List<User> list = new ArrayList<User>();
  list.add(new User(1, "大", "象"));
  list.add(new User(12, "老", "象"));
  list.add(new User(13, "小", "象"));
  list.add(new User(2, "老", "虎"));
  list.add(new User(3, "毛", "二逼"));
  list.add(new User(4, "熊", "三炮"));
  list.add(new User(6, "高", "象"));
  list.add(new User(2, "搞", "对象"));
  list.add(new User(5, "处", "象"));
  list.add(new User(7, "大", "象"));
  list.add(new User(9, "大", "象"));
  list.add(new User(11, "大", "象"));
  list.add(new User(111, "大", "象"));
  list.add(new User(13, "大", "象"));
  list.add(new User(122, "大", "象"));
  list.add(new User(133, "大", "象"));

  UserSearch us = new UserSearch();

  try {
   us.createIndex(list);
   System.out.println("create success!");
  } catch (CorruptIndexException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (LockObtainFailedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

 public static void search() throws CorruptIndexException, IOException,
   ParseException {

  UserSearch us = new UserSearch();
  
  // 查询条件
  List<User> list = us.search("lastName", "象");
  if (list.size() > 0) {
   System.out.println("找到:" + list.size() + "个结果! ");
   for (User info : list) {
    System.out.println("id=" + info.getId() + ",name="
      + info.getFirstName() + info.getLastName());
   }
  } else {
   System.out.println("没有找到结果");
  }

 }
}