基于Lucene框架 Compass 的使用例子
fmms
13年前
Compass 资源下载地址:
http://sourceforge.net/projects/compass/files/compass/2.2.0/compass-2.2.0-with-dependencies.zip/download
选取三个jar包:commons-logging.jar, compass-2.2.0.jar, lucene-core.jar.
使用OSEM(Object/SearchEngine Mapping)映射方案
映射的实体对象Book.java:
package com.sse.first; import org.compass.annotations.Index; import org.compass.annotations.Searchable; import org.compass.annotations.SearchableId; import org.compass.annotations.SearchableProperty; import org.compass.annotations.Store; @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; } public void setId(String id) { this.id = id; } @SearchableProperty(boost=2.0F, index=Index.TOKENIZED, store=Store.YES) public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } @SearchableProperty(index=Index.TOKENIZED, store=Store.YES) public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } @SearchableProperty(index=Index.NO, store=Store.YES) public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } @Override public String toString() { return "[ "+ id +" ] " + title +" -- " + author + " $ " + price; } }
主搜索服务Searcher.java:
package com.sse.first;
import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.compass.annotations.config.CompassAnnotationsConfiguration; import org.compass.core.Compass; import org.compass.core.CompassException; import org.compass.core.CompassHits; import org.compass.core.CompassSession; import org.compass.core.CompassTransaction; public class Searcher { private Compass compass; /** * 初始化检索器 * @param path */ public Searcher(String path){ compass = new CompassAnnotationsConfiguration() .setConnection(path) .addClass(Book.class) .setSetting("compass.engine.highlighter.default.formatter.simple.pre", "<b>") .setSetting("compass.engine.highlighter.default.formatter.simple.post", "</b>") .buildCompass(); Runtime.getRuntime().addShutdownHook(new Thread(){ public void run(){ compass.close(); } }); } /** * 建立数据索引 * @param book */ public void index(Book book){ System.out.println("index book : " + book); CompassSession session = null; CompassTransaction tx = null; try { session = compass.openSession(); tx = session.beginTransaction(); session.create(book); tx.commit(); } catch (CompassException e) { 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 (CompassException e) { tx.rollback(); e.printStackTrace(); } finally{ if ( session != null ) session.close(); } } /** * 重置对象索引 * @param book */ public void reIndex(Book book){ unIndex(book); index(book); } /** * 查询 * @param q * @return */ @SuppressWarnings("unchecked") public List<Book> search(String q){ CompassSession session = null; CompassTransaction tx = null; try { session = compass.openSession(); tx = session.beginTransaction(); CompassHits hits = session.find(q); int n = hits.length(); if ( n == 0 ) return Collections.EMPTY_LIST; List<Book> books = new ArrayList<Book>(n); for (int i = 0; i < n; i++) books.add((Book)hits.data(i)); hits.close(); tx.commit(); return books; } catch (CompassException e) { tx.rollback(); e.printStackTrace(); } return Collections.EMPTY_LIST; } }
测试主入口main.java:
package com.sse.first; import java.io.BufferedReader; import java.io.File; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.UUID; import com.Const; //import javax.swing.JOptionPane; public class Main { static List<Book> db = new ArrayList<Book>(); static Searcher search = new Searcher(Const.indexPath); public static void main(String[] args) { // deleteAllBooks(); add(new Book(UUID.randomUUID().toString(), "Thinking in Java", "Bruce", 10.9f)); add(new Book(UUID.randomUUID().toString(), "Effective Java", "Joshua", 12.4f)); add(new Book(UUID.randomUUID().toString(), "Java Thread Programming", "Pail", 25.6f)); Runtime.getRuntime().addShutdownHook(new Thread(){ public void run(){ deleteAllIndex(null); } }); 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 ); } private static int displaySelection() { System.out.println("\n=====select index ======= "); System.out.println("1. List all books "); System.out.println("2. Add new 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; } /** * 从控制台读数字作为参数 * @return */ private static int readKey() { // String ss=JOptionPane.showInputDialog("","Select Index :"); // try{ // return Integer.parseInt(ss); // }catch(Exception e){ // System.out.println("输入的数据类型不对,程序将退出"); // System.exit(0); // } System.out.println("Select Index :"); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); try{ return Integer.parseInt(reader.readLine()); }catch(Exception e){ throw new RuntimeException(); } } /** * 从控制台读字符串作为参数 * @param prompt * @return */ private static String readLine(String prompt) { // return JOptionPane.showInputDialog("" , prompt); System.out.println(prompt); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); try{ return reader.readLine(); }catch(Exception e){ throw new RuntimeException(); } } /** * 检索数据 */ private static void searchBook() { String q = readLine("Enter keyword: "); List<Book> books = search.search(q); System.out.println("============ Search Results: " + books.size() + " ======== "); for (Book book : books ) { System.out.println(book); } } /** * 删除数据,并删除索引 */ private static void deleteBook() { listBooks(); System.out.println("Book Index: "); int n = readKey(); Book book = db.remove(n - 1 ); search.unIndex(book); } // private static void deleteAllBooks(){ // for (Book book : db ){ // db.remove(book); // search.unIndex(book); // } // } /** * 删除所有的索引文件 * @param file */ private static void deleteAllIndex(File file){ if ( file == null) file = new File(Const.indexPath); if ( file.exists() ){ if ( file.isFile() ) file.delete(); else if ( file.isDirectory() ){ File files[] = file.listFiles(); for (File temp : files){ deleteAllIndex(temp); } } } } /** * 添加新的数据 */ private static void addBook() { String title = readLine(" Title: "); String author = readLine("Author: "); String price = readLine(" Price: "); Book book = new Book(UUID.randomUUID().toString(), title, author,Float.parseFloat(price)); add(book); } /** * 列出所有的数据 */ private static void listBooks(){ System.out.println(" =======DataBase========="); for (Iterator<Book> iterator = db.iterator(); iterator.hasNext();) { Book book = (Book) iterator.next(); System.out.println(book.toString()); } } /** * 添加数据并建立索引 * @param book */ private static void add(Book book){ db.add(book); search.index(book); } }