单独使用lucene/compass实现增量索引

//需要导入的jar包:commons-logging.jar, compass-2.2.0.jar, lucene-core.jar
 @Searchable
public class Book {
	private String id;// 编号
	private String title;// 标题
	private String author;// 作者
	private float price;// 价格
	public Book() { }
	public Book(String id, String title, String author, float price) {
		this.id = id;
		this.title = title;
		this.author = author;
		this.price = price;
	}
	@SearchableId
	public String getId() {
		return id;
	}
	@SearchableProperty(boost = 2.0F, index = Index.TOKENIZED, store = Store.YES)
	public String getTitle() {
		return title;
	}
	@SearchableProperty(index = Index.TOKENIZED, store = Store.YES)
	public String getAuthor() {
		return author;
	}
	@SearchableProperty(index = Index.NO, store = Store.YES)
	public float getPrice() {
		return price;
	}
	public void setId(String id) {
		this.id = id;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public void setPrice(float price) {
		this.price = price;
	}
	@Override
	public String toString() {
		return "[" + id + "] " + title + " - " + author + " $ " + price;
	}
}
 public class Searcher {
	protected Compass compass;
	public Searcher() {  }
	public Searcher(String path) {
		compass = new CompassAnnotationsConfiguration().setConnection(path).addClass(Book.class).setSetting("compass.engine.highlighter.default.formatter.simple.pre", "<font color='red'>")
				.setSetting("compass.engine.highlighter.default.formatter.simple.post", "</font>").buildCompass();
		Runtime.getRuntime().addShutdownHook(new Thread() {
			public void run() {
				compass.close();
			}
		});
	}
	/**
	 * 新建索引
	 * @param book
	 */
	public void index(Book book) {
		CompassSession session = null;
		CompassTransaction tx = null;
		try {
			session = compass.openSession();
			tx = session.beginTransaction();
			session.create(book);
			tx.commit();
		} catch (RuntimeException e) {
			if (tx != null) {
				tx.rollback();
				e.printStackTrace();
			}
		} finally {
			if (session != null) {
				session.close();
			}
		}
	}
	/**
	 * 删除索引
	 * @param book
	 */
	public void unIndex(Book book) {
		CompassSession session = null;
		CompassTransaction tx = null;
		try {
			session = compass.openSession();
			tx = session.beginTransaction();
			session.delete(book);
			tx.commit();
		} catch (RuntimeException e) {
			tx.rollback();
			e.printStackTrace();
		} finally {
			if (session != null) {
				session.close();
			}
		}
	}
	/**
	 * 重建索引
	 * @param book
	 */
	public void reIndex(Book book) {
		unIndex(book);
		index(book);
	}
	/**
	 * 搜索
	 * @param queryString
	 * @return
	 */
	public List<Book> search(String queryString) {
		CompassSession session = null;
		CompassTransaction tx = null;
		try {
			session = compass.openSession();
			tx = session.beginTransaction();
			CompassHits hits = session.find(queryString);
			int n = hits.length();
			if (0 == n) {
				return Collections.emptyList();
			}
			List<Book> books = new ArrayList<Book>();
			for (int i = 0; i < n; i++) {
				books.add((Book) hits.data(i));
			}
			hits.close();
			tx.commit();
			return books;
		} catch (RuntimeException e) {
			tx.rollback();
			e.printStackTrace();
		} finally {
			if (session != null) {
				session.close();
			}
		}
		return null;
	}
}
//测试
public class Main {
	static List<Book> db = new ArrayList<Book>();
	static Searcher searcher = new Searcher("index");

	public static void main(String[] args) {
		db.add(new Book("1", "Thinking in Java", "Bruce", 109.0f));
		db.add(new Book("2", "Effective Java", "Joshua", 12.4f));
		db.add(new Book("3", "Java Thread Programing", "Paul", 25.8f));
		int n;
		do {
			n = displaySelection();
			switch (n) {
			case 1:
				listBooks();
				break;
			case 2:
				addBook();
				break;
			case 3:
				deleteBook();
				break;
			case 4:
				searchBook();
				break;
			case 5:
				return;
			}
		} while (n != 0);
	}
	static int displaySelection() {
		System.out.println("\n==select==");
		System.out.println("1. List all books");
		System.out.println("2. Add book");
		System.out.println("3. Delete book");
		System.out.println("4. Search book");
		System.out.println("5. Exit");
		int n = readKey();
		if (n >= 1 && n <= 5)
			return n;
		return 0;
	}
	/**
	 * 增加一本书到数据库和索引中
	 * @param book
	 */
	private static void add(Book book) {
		db.add(book);
		searcher.index(book);
	}
	/**
	 * 打印出数据库中的所有书籍列表
	 */
	public static void listBooks() {
		System.out.println("==Database==");
		int n = 1;
		for (Book book : db) {
			System.out.println(n + ")" + book);
			n++;
		}
	}
	/**
	 * 根据用户录入,增加一本书到数据库和索引中
	 */
	public static void addBook() {
		String bookID = readLine(" BookID: ");
		String title = readLine(" Title: ");
		String author = readLine(" Author: ");
		String price = readLine(" Price: ");
		Book book = new Book(bookID, title, author, Float.valueOf(price));
		add(book);
	}
	/**
	 * 删除一本书,同时删除数据库,索引库中的
	 */
	public static void deleteBook() {
		listBooks();
		System.out.println("Book index: ");
		int n = readKey();
		Book book = db.remove(n - 1);
		searcher.unIndex(book);
	}
	/**
	 * 根据输入的关键字搜索书籍
	 */
	public static void searchBook() {
		String queryString = readLine(" Enter keyword: ");
		List<Book> books = searcher.search(queryString);
		System.out.println(" ====search results:" + books.size() + "====");
		for (Book book : books) {
			System.out.println(book);
		}
	}
	public static int readKey() {
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		try {
			int n = reader.read();
			n = Integer.parseInt(Character.toString((char) n));
			return n;
		} catch (Exception e) {
			throw new RuntimeException();
		}
	}
	public static String readLine(String propt) {
		System.out.println(propt);
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		try {
			return reader.readLine(); //读取用户输入的书名关键字
		} catch (Exception e) {
			throw new RuntimeException();
		}
	}
}



转载于:https://my.oschina.net/u/1413786/blog/180450

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值