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);
}
}
执行结果如下图所示:
http://download.csdn.net/detail/shenshouer/3660543