hibernateSearch3開發示例

1、開發環境:spring2.5、hibernate3.3.1GA、hibernateSearch3.1.0GA;

2、開發是基於maven上開發的,首先新建一個web工程,添加maven支持,在pom.xml中添加一下幾個依賴包:
 <dependencies>    
<dependency>
<groupId>org.apache.openejb</groupId>
<artifactId>javaee-api</artifactId>
<version>5.0-1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search</artifactId>
<version>3.1.0.GA</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.4.0.GA</version>
</dependency>

<!-- hibernate framework end -->

<!-- lucene start -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-highlighter</artifactId>
<version>3.0.1</version>
</dependency>
</dependencies>


其他就是hibernate+spring的配置了;
注意一點的就是在配置文件hibernate的屬性後面加上索引的監聽和索引存放的位置,如:
<!-- Spring管理Hibernate的Mapping對象 -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
${hibernate.dialect}
</prop>
<prop key="hibernate.hbm2ddl.auto">
${hibernate.hbm2ddl.auto}
</prop>
<prop key="hibernate.show_sql">
${hibernate.show_sql}
</prop>
<prop key="hibernate.use_sql_comments">
${hibernate.use_sql_comments}
</prop>
<prop key="hibernate.use_outer_join">
${hibernate.use_outer_join}
</prop>
<prop key="hibernate.current_session_context_class">
${hibernate.current.session.context.class}
</prop>
<prop key="connection.autoReconnect">
${connection.autoReconnect}
</prop>
<prop key="connection.autoReconnectForPools">
${connection.autoReconnectForPools}
</prop>
<prop key="connection.is-connection-validation-required">
${connection.is-connection-validation-required}
</prop>

<!-- 索引配置 -->
<prop key="hibernate.search.default.directory_provider">
org.hibernate.search.store.FSDirectoryProvider
</prop>
<prop key="hibernate.search.default.indexBase">
d:/JAVA/hibernateIndex
</prop>

</props>
</property>

<!-- 索引配置-->
<property name="eventListeners">
<map>
<entry key="post-update">
<bean class="org.hibernate.search.event.FullTextIndexEventListener" />
</entry>
<entry key="post-insert">
<bean class="org.hibernate.search.event.FullTextIndexEventListener" />
</entry>
<entry key="post-delete">
<bean class="org.hibernate.search.event.FullTextIndexEventListener" />
</entry>
</map>
</property>

<property name="mappingDirectoryLocations">
<list>
<value>${hibernate.mappingDirectoryLocations}</value>
</list>
</property>
</bean>


這時啓動如果報slf4j錯誤,可能是你的slf4j包衝突,需要把你lib裏相關的jar包刪了,在maven支持中還剩下slf4j-api-1.4.2.jar,需要導入slf4j-logging-1.4.2.jar包,如果導入更高版可能會報錯,這個包在百度搜slf4j就能進入它的官網,很容易找到;

這個時候啓動如果不報錯,那成功一半了;接下來就是配置實體類了,比如一個商城系統要對訂單建索引,實體類如(給出關鍵部分代碼):
@Entity
@Indexed(index="shopOrders")
public class ShopOrders implements java.io.Serializable {


// Fields

@DocumentId
private String id;
private Integer uid;
@Field(index=Index.TOKENIZED,store=Store.YES)
private String username;
@Field(index=Index.UN_TOKENIZED,store=Store.YES)
private Integer isDelete;


這個時候啓動你會發現你指定的路徑下已經有了一個shopOrders文件夾,如果這個時候去搜索是搜索不到的,還沒有初始化數據;
以下是數據初始化和查詢的代碼:

import java.util.Date;
import java.util.List;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Query;
import org.hibernate.CacheMode;
import org.hibernate.FlushMode;
import org.hibernate.ScrollMode;
import org.hibernate.ScrollableResults;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.search.FullTextQuery;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.springframework.orm.hibernate3.LocalSessionFactoryBean;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.china.fung.hibernate.pojo.shop.ShopOrders;

public class Dao extends HibernateDaoSupport {

private static SessionFactory sessionFactory;
private static Session session = null;
private static LocalSessionFactoryBean factoryBean = null;

public void getMySession() throws Exception {
sessionFactory = this.getHibernateTemplate().getSessionFactory();
session = sessionFactory.openSession();
}

public List search(String keyword) throws Exception {
this.getMySession();
BooleanQuery.setMaxClauseCount(100000);
BooleanQuery booleanQuery = new BooleanQuery();
StandardAnalyzer analyzer=new StandardAnalyzer();
// 基本關鍵詞搜索
String[] searchFields = new String[] { "username" };//成員變量
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(
searchFields,analyzer);
queryParser.setDefaultOperator(QueryParser.Operator.AND);
Query query = queryParser.parse(keyword);
booleanQuery.add(query,BooleanClause.Occur.MUST);

QueryParser parse=new QueryParser("isDelete",analyzer);
Query query1=parse.parse("0");
parse.setDefaultOperator(QueryParser.Operator.AND);
booleanQuery.add(query1,BooleanClause.Occur.MUST);

FullTextSession fullSession = Search.getFullTextSession(session);
FullTextQuery fullQuery = fullSession.createFullTextQuery(booleanQuery,
ShopOrders.class);
int size = fullQuery.getResultSize();
System.out.println("size:" + size);

return fullQuery.list();
}

public void createIndexByHibernateSearch() throws Exception{
this.getMySession();
long startTime = new Date().getTime();
int BATCH_SIZE = 1000;
FullTextSession s = Search.getFullTextSession(session);

// Transaction tr = s.beginTransaction();
s.setFlushMode(FlushMode.MANUAL);
s.setCacheMode(CacheMode.IGNORE);
ScrollableResults results = s.createQuery("from ShopOrders").setFetchSize(BATCH_SIZE).scroll(ScrollMode.FORWARD_ONLY);
int index = 0;
while (results.next()) {
index++;
s.index(results.get(0)); // index each element
if (index % BATCH_SIZE == 0) {
// s.flushToIndexes(); //apply changes to indexes
s.clear(); // clear since the queue is processed
}
}
s.clear();
long endTime = new Date().getTime();
logger.warn("建立Product索引 , 這花費了" + (endTime - startTime) + " 毫秒來把文檔增加到索引裏面去!");
// tr.commit();

}


}


好了,到這基本就完事了,只需要在service裏調用就行了,別忘了,先調用createIndexByHibernateSearch方法初始化(一次就行),再調用search方法搜索;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章