﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Terry.B.Li           彬-文章分类-Hibernate Search</title><link>http://www.blogjava.net/libin2722/category/46237.html</link><description>虚其心，可解天下之问；专其心，可治天下之学；静其心，可悟天下之理；恒其心，可成天下之业。</description><language>zh-cn</language><lastBuildDate>Fri, 08 Apr 2011 09:35:35 GMT</lastBuildDate><pubDate>Fri, 08 Apr 2011 09:35:35 GMT</pubDate><ttl>60</ttl><item><title>Lucene-2.2.0 源代码阅读学习</title><link>http://www.blogjava.net/libin2722/articles/347516.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Sat, 02 Apr 2011 03:40:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/347516.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/347516.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/347516.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/347516.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/347516.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 【下载】																				下载链接：																		http://apache.mirror.phpchina.com/lucene/java/																												以选择																		lucene-2.0.0.zip																...&nbsp;&nbsp;<a href='http://www.blogjava.net/libin2722/articles/347516.html'>阅读全文</a><img src ="http://www.blogjava.net/libin2722/aggbug/347516.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2011-04-02 11:40 <a href="http://www.blogjava.net/libin2722/articles/347516.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>初试Hibernate Search</title><link>http://www.blogjava.net/libin2722/articles/330794.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Fri, 03 Sep 2010 00:46:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/330794.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/330794.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/330794.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/330794.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/330794.html</trackback:ping><description><![CDATA[
		<p>不久前Hibernate推出了Hibernate Search 3.0 
GA，由它的名字大家也可以大概猜到它的作用是对数据库中的数据进行检索的。它是hibernate对著名的全文检索系统Lucene的一个集成方案，作
用在于对数据表中某些内容庞大的字段（如声明为text的字段）建立全文索引，这样通过hibernate 
search就可以对这些字段进行全文检索后获得相应的POJO，从而加快了对内容庞大字段进行模糊搜索的速度（sql语句中like匹配）。</p>
		<p>Hibernate Search运行的环境如下：</p>
		<p>1、JDK或JRE 5.0以上</p>
		<p>2、Hibernate-Search以及相应的依赖包</p>
		<p>3、Hibernate Core 3.2.X</p>
		<p>4、Hibernate Annotations 3.3.X</p>
		<p>一、配置</p>
		<p>使用过Lucene的人都知道，Lucene是使用Directory这个概念来存储索引文件的，所以在Hibernate 
Search中提供了一个初始化、配置化的工厂类DirectoryProvider来生成相应的Directory。而在这里，我使用了
FSDirectoryProvider这个工厂类，其中FS代表文件系统，意思是索引文件保存在文件系统中。因此，我们在<font>hibernate.cfg.xml文件中加入了一下内容：</font></p>
		<div class="code_title">xml 代码</div>
		<div class="bar">
				<ol class="dp-xml">
						<li class="alt">
								<span>
										<span class="tag">&lt;</span>
										<span class="tag-name">property</span>
										<span> </span>
										<span class="attribute">name</span>
										<span>=</span>
										<span class="attribute-value">"hibernate.search.default.directory_provider"</span>
										<span class="tag">&gt;</span>
										<span>  </span>
								</span>
						</li>
						<li class="">
								<span>          org.hibernate.search.store.FSDirectoryProvider   </span>
						</li>
						<li class="alt">
								<span>
										<span class="tag">&lt;/</span>
										<span class="tag-name">property</span>
										<span class="tag">&gt;</span>
										<span>  </span>
								</span>
						</li>
						<li class="">
								<span>
										<span class="tag">&lt;</span>
										<span class="tag-name">property</span>
										<span> </span>
										<span class="attribute">name</span>
										<span>=</span>
										<span class="attribute-value">"hibernate.search.default.indexBase"</span>
										<span class="tag">&gt;</span>
										<span>  </span>
								</span>
						</li>
						<li class="alt">
								<span>          E:/temp/index   </span>
						</li>
						<li class="">
								<span>
										<span class="tag">&lt;/</span>
										<span class="tag-name">property</span>
										<span class="tag">&gt;</span>
										<span>  </span>
								</span>
						</li>
				</ol>
		</div>
		<p>其中属性<font>hibernate.search.default.indexBase代表索引文件默认的保存位置。</font></p>
		<p>这些属性设置完成后，接下来就是使用Annotation对指定POJO的指定属性进行配置了。如下：</p>
		<div class="code_title">java 代码</div>
		<div class="dp-highlighter">
				<div class="bar">
						<ol class="dp-j">
								<li class="alt">
										<span>
												<span class="annotation">@Indexed</span>
												<span>(index = </span>
												<span class="string">"text"</span>
												<span>)   </span>
										</span>
								</li>
								<li class="">
										<span>
												<span class="keyword">public</span>
												<span> </span>
												<span class="keyword">class</span>
												<span> Text </span>
												<span class="keyword">implements</span>
												<span> java.io.Serializable   </span>
										</span>
								</li>
								<li class="alt">
										<span>{   </span>
								</li>
								<li class="">
										<span>    </span>
										<span class="annotation">@DocumentId</span>
										<span>  </span>
								</li>
								<li class="alt">
										<span>    </span>
										<span class="keyword">private</span>
										<span> Integer id;   </span>
								</li>
								<li class="">
										<span>  </span>
								</li>
								<li class="alt">
										<span>    </span>
										<span class="keyword">private</span>
										<span> String fileName;   </span>
								</li>
								<li class="">
										<span>  </span>
								</li>
								<li class="alt">
										<span>    </span>
										<span class="keyword">private</span>
										<span> String filePath;   </span>
								</li>
								<li class="">
										<span>  </span>
								</li>
								<li class="alt">
										<span>    </span>
										<span class="annotation">@Field</span>
										<span>(name = </span>
										<span class="string">"content"</span>
										<span>, store = Store.NO, index = Index.TOKENIZED, analyzer = </span>
										<span class="annotation">@Analyzer</span>
										<span>(impl = ChineseAnalyzer.</span>
										<span class="keyword">class</span>
										<span>))   </span>
								</li>
								<li class="">
										<span>    </span>
										<span class="keyword">private</span>
										<span> String content;   </span>
								</li>
								<li class="alt">
										<span>  </span>
								</li>
								<li class="">
										<span>    ......   </span>
								</li>
								<li class="alt">
										<span>}  </span>
								</li>
						</ol>
				</div>
				<p>其中@Indexed用于标示需要建立全文索引的实体类，它包含一个属性index用于标示这个全文索引的名字</p>
				<p>@DocumentId用于标示实体类中的唯一的属性保存在索引文件中，是当进行全文检索时可以这个唯一的属性来区分索引中其他实体对象，一般使用实体类中的主键属性</p>
				<p>@Field就是用来标示Lucene的Field字段，其中name属性用于标示Field的名称，store属性用于标示这个属性的内容是否需要保存在索引中，index属性标示该字段属性是否进行分词（<font>Index.TOKENIZED</font>），analyzer用于标示建立索引时所使用的分析器是什么类，这里使用Lucene自带的ChineseAnalyzer</p>
				<p>
						<br />
				</p>
				<div class="postbody clearfix">
						<p>二、建立索引</p>
						<p>配置完成以上设置之后，Hibernate Search的配置工作算是大功告成了，剩下的就是如何在编码时使用到Hibernate 
Search。其实Hibernate Search的使用与我们平时Hibernate的使用基本一致，索引的建立工作是可以由Hibernate 
Search后台自动处理的，无需手工操作，其中的主要差别有</p>
						<p>1、Configuration</p>
						<p>由于本文中Hibernate Search配置是由Annotation来完成的，所以我们在初始化Configuration、SessionFactory、Session时应该这样写：</p>
						<div class="code_title">java 代码</div>
						<div class="dp-highlighter">
								<div class="bar">
										<ol class="dp-j">
												<li class="alt">
														<span>
																<span>factory = </span>
																<span class="keyword">new</span>
																<span> AnnotationConfiguration().configure(file).buildSessionFactory();  </span>
														</span>
												</li>
										</ol>
								</div>
								<p>使用AnnotationConfiguaration来代理平常使用的Configuration</p>
								<p>2、Session</p>
								<p>要使用Hibernate Search的功能就不能单纯使用平常的Session来开始事务，进行数据库操作，而是应该改用FullTextSession</p>
								<div class="code_title">java 代码</div>
								<div class="dp-highlighter">
										<div class="bar">
												<ol class="dp-j">
														<li class="alt">
																<span>
																		<span class="comment">//获取Session </span>
																		<span>  </span>
																</span>
														</li>
														<li class="">
																<span>Session session = HibernateUtil.getSession();   </span>
														</li>
														<li class="alt">
																<span>
																		<span class="comment">//封装Session为FullTextSession </span>
																		<span>  </span>
																</span>
														</li>
														<li class="">
																<span>FullTextSession fullTextSession = Search.createFullTextSession(session);   </span>
														</li>
														<li class="alt">
																<span>  </span>
														</li>
														<li class="">
																<span>
																		<span class="comment">//开始事务 </span>
																		<span>  </span>
																</span>
														</li>
														<li class="alt">
																<span>Transaction tx = fullTextSession.beginTransaction();   </span>
														</li>
														<li class="">
																<span>  </span>
														</li>
														<li class="alt">
																<span>......   </span>
														</li>
														<li class="">
																<span>  </span>
														</li>
														<li class="alt">
																<span>
																		<span class="comment">//提交事务 </span>
																		<span>  </span>
																</span>
														</li>
														<li class="">
																<span>tx.commit();   </span>
														</li>
														<li class="alt">
																<span>
																		<span class="comment">//关闭会话 </span>
																		<span>  </span>
																</span>
														</li>
														<li class="">
																<span>fullTextSession.close();  </span>
														</li>
												</ol>
										</div>
										<p>这样，我们使用FullTextSession进行save，update，delete操作hibernate search将会自动根据配置在后台对相应的域建立全文索引了</p>
										<p>
												<br />
										</p>
										<p>三、检索</p>
										<p>接下来就是说一下如何使用全文检索功能来检索实体对象了。</p>
										<div class="code_title">java 代码</div>
										<div class="bar">
												<ol class="dp-j">
														<li class="alt">
																<span>
																		<span>Session session = HibernateUtil.getSession();   </span>
																</span>
														</li>
														<li class="">
																<span>FullTextSession fullTextSession = Search.createFullTextSession(session);   </span>
														</li>
														<li class="alt">
																<span>  </span>
														</li>
														<li class="">
																<span>Transaction tx = fullTextSession.beginTransaction();   </span>
														</li>
														<li class="alt">
																<span>  </span>
														</li>
														<li class="">
																<span>QueryParser parser = </span>
																<span class="keyword">new</span>
																<span> QueryParser(</span>
																<span class="string">"content"</span>
																<span>, </span>
																<span class="keyword">new</span>
																<span> ChineseAnalyzer());   </span>
														</li>
														<li class="alt">
																<span>  </span>
														</li>
														<li class="">
																<span>Query query = fullTextSession.createFullTextQuery(parser.parse(word),   </span>
														</li>
														<li class="alt">
																<span>        Text.</span>
																<span class="keyword">class</span>
																<span>);   </span>
														</li>
														<li class="">
																<span>  </span>
														</li>
														<li class="alt">
																<span>List result = query.list();   </span>
														</li>
														<li class="">
																<span>
																		<span class="keyword">for</span>
																		<span> (</span>
																		<span class="keyword">int</span>
																		<span> i = </span>
																		<span class="number">0</span>
																		<span>; result != </span>
																		<span class="keyword">null</span>
																		<span> &amp;&amp; i &lt; result.size(); i++)   </span>
																</span>
														</li>
														<li class="alt">
																<span>{   </span>
														</li>
														<li class="">
																<span>    Text pojo = (Text) result.get(i);   </span>
														</li>
														<li class="alt">
																<span>    System.out.println(</span>
																<span class="string">"文件名："</span>
																<span> + pojo.getFileName());   </span>
														</li>
														<li class="">
																<span>    System.out.println(</span>
																<span class="string">"文件路径："</span>
																<span> + pojo.getFilePath());   </span>
														</li>
														<li class="alt">
																<span>    System.out.println();   </span>
														</li>
														<li class="">
																<span>}   </span>
														</li>
														<li class="alt">
																<span>  </span>
														</li>
														<li class="">
																<span>tx.commit();   </span>
														</li>
														<li class="alt">
																<span>fullTextSession.close();  </span>
														</li>
												</ol>
										</div>
										<p>首先是建立相应的QueryParser由他来对输入的关键字进行切分后产生Lucene下的Query实例，最后通过
FullTextSession的createFullTextQuery方法生成hibernate下的Query实例，执行list方法即可获得查询
的实例结果集合。</p>
										<p>四、完</p>
								</div>
						</div>
				</div>
		</div>
<img src ="http://www.blogjava.net/libin2722/aggbug/330794.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2010-09-03 08:46 <a href="http://www.blogjava.net/libin2722/articles/330794.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>