----------------------------------------------------------------------------------------------
[版權申明:本文系做者原創,轉載請註明出處]
文章出處:http://blog.csdn.net/sdksdk0/article/details/52589761
做者:朱培 ID:sdksdk0 javascript
--------------------------------------------------------------------------------------------html
對工做單使用 like模糊查詢時,實際上 數據庫內部索引沒法使用 ,須要逐條比較查詢內容,效率比較低在數據量不少狀況下, 提供模糊查詢性能,咱們能夠使用lucene全文索引庫技術。本文示例是在SSH框架中進行使用。使用Hibernate Search (用來整合 Hibernate + Lucene),工做單搜索功能。java
一、首先能夠在咱們的maven工程中引入須要的jar包,web
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-search</artifactId> <version>3.4.2.Final</version> </dependency>
二、導入IKAnalyzer分詞器。由於IKAnalyzer在maven中沒有,因此咱們須要手動下載這個jar包,固然了,在http://mvnrepository.com/網站上面能夠找到。spring
下載好以後能夠裝載到你本身的maven倉庫中或者直接放在你工程的lib目錄中,而後來引用:例如個人是在sql
<dependency> <groupId>org.wltea</groupId> <artifactId>IKAnalyzer</artifactId> <version>2012_u6</version> <scope>system</scope> <systemPath>E:\myeclipse_work\BOS\src\main\webapp\WEB-INF\lib\IKAnalyzer2012_u6.jar</systemPath> </dependency>
三、在resource目錄中新建stopword.dic文件,內容爲:數據庫
a an and are as at be but by for if in into is it no not of on or such that the their then there these they this to was will with
四、新建一個IKAnalyzer.cfg.xml文件,內容爲:緩存
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>IK Analyzer 擴展配置</comment> <!--用戶能夠在這裏配置本身的擴展字典 <entry key="ext_dict">ext.dic;</entry> --> <!--用戶能夠在這裏配置本身的擴展中止詞字典--> <entry key="ext_stopwords">stopword.dic;</entry> </properties>
五、在spring中進行配置:在配置SessionFactory中加入一行:固然了,這個時候須要本身去D盤目錄中新建一個文件夾DBIndexsession
<!-- 配置索引庫 --> <prop key="hibernate.search.default.indexBase">d:/DBIndex</prop>
完整的以下:app
<!-- 配置SessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <!-- 配置hibernate 屬性 ,參考 hibernate.properties 文件 --> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <!-- 配置索引庫 --> <prop key="hibernate.search.default.indexBase">d:/DBIndex</prop> </props> </property> <!-- 映射hbm --> <property name="mappingDirectoryLocations" value="classpath:cn/tf/bos/domain"></property> </bean>
六、在想要實現查詢功能的那個domain中添加註解:想要搜索哪一個字段就在哪一個字段上面加上@Field註解,注意導入的是IKAnalyzer的分詞器,不是hibernate-search的分詞器。
@Indexed @Analyzer(impl = IKAnalyzer.class) public class WorkOrderManage implements java.io.Serializable { // Fields @DocumentId private String id; @Field private String arrivecity; //到達城市 @Field private String product;
分詞的效果以下:
使用 Luke 工具,查詢索引文件內容 ! 在cmd中運行 java -jar lukeall-3.5.0.jar,便可打開下圖這個頁面,查看具體的索引信息。
七、在界面中添加搜索框,我這裏使用的是easyui,so...
<div data-options="region:'north'"> <!-- 編寫搜索框 --> <!-- prompt 默認提示內容 menu 搜索條件下拉選項 searcher 點擊搜索按鈕執行js函數名稱 --> <input id="ss" class="easyui-searchbox" style="width:300px" data-options="prompt:'請輸入您的查詢內容',menu:'#nm',searcher:doSearch"/> <div id="nm"> <div data-options="name:'arrivecity'">按照到達地搜索</div> <div data-options="name:'product'">按照貨物名稱搜索</div> </div> </div>
八、寫doSeach這個js函數
function doSearch(value,name){ //將查詢條件緩存到datagrid $('#grid').datagrid('load',{ conditionName:name, conditionValue:value }); }
九、在action中接收頁面傳過來的name和value屬性的值,而後進行處理:
public String findByPage(){ if(conditionName!=null && conditionName.trim().length()>0 && conditionValue!=null && conditionValue.trim().length()>0){ //有條件查詢 PageResponseBean pageResponseBean=workordermanagerService.findByLucene(conditionName,conditionValue,page,rows); ActionContext.getContext().put("pageResponseBean", pageResponseBean); }else{ DetachedCriteria detachedCriteria=DetachedCriteria.forClass(WorkOrderManage.class); PageRequestBean pageRequestBean=initPageRequestBean(detachedCriteria); PageResponseBean pageResponseBean=workordermanagerService.findByPage(pageRequestBean); ActionContext.getContext().put("pageResponseBean", pageResponseBean); } return "findByPage"; } private String conditionName; private String conditionValue; public void setConditionName(String conditionName) { this.conditionName = conditionName; } public void setConditionValue(String conditionValue) { this.conditionValue = conditionValue; }
返回值以後如何處理這裏我就不在說了。
十、在service中進行處理,通過service和serviceImpl以後,就會到達dao中,因此咱們能夠在dao中進行處理。
//luence查詢 @Override public PageResponseBean findByLucene(String conditionName, String conditionValue, int page, int rows) { Session session=this.getSession(); FullTextSession fullTextSession=new FullTextSessionImpl(session); Query query=new WildcardQuery(new Term(conditionName,"*"+conditionValue+"*")); //得到全文檢索的query FullTextQuery fullTextQuery=fullTextSession.createFullTextQuery(query); PageResponseBean pageResponseBean=new PageResponseBean(); pageResponseBean.setTotal(fullTextQuery.getResultSize()); //當前頁數據 int firstResult=(page-1)*rows; int maxResults=rows; List list=fullTextQuery.setFirstResult(firstResult).setMaxResults(maxResults).list(); pageResponseBean.setRows(list); return pageResponseBean; }
十一、在頁面中查看搜索的效果
這樣咱們整個開發流程就完成了。使用luence對大數據量中的模糊查詢是很是實用的功能,固然了,luence只適用於站內搜索,對於模糊查詢的支持仍是很是好的。