Hibernate search _JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Hibernate search

Hibernate search

 2012/1/13 9:06:34  fncj  程序员俱乐部  我要评论(0)
  • 摘要:Hibernate搜索引擎lucene全文检索百度搜索引擎全文搜索引擎全文搜索引擎是名副其实的搜索引擎,国外代表有Google,国内则有著名的百度搜索。它们从互联网提取各个网站的信息(以网页文字为主),建立起数据库,并能检索与用户查询条件相匹配的记录,按一定的排列顺序返回结果。根据搜索结果来源的不同,全文搜索引擎可分为两类,一类拥有自己的网页抓取、索引、检索系统(Indexer),有独立的“蜘蛛”(Spider)程序、或爬虫(Crawler)、或“机器人”(Robot)程序(这三种称法意义相同
  • 标签:hibernate
Hibernate搜索引擎lucene全文检索百度
搜索引擎

全文搜索引擎

全文搜索引擎是名副其实的搜索引擎,国外代表有Google,国内则有著名的百度搜索。它们从互联网提取各个网站的信息(以网页文字为主),建立起数据库,并能检索与用户查询条件相匹配的记录,按一定的排列顺序返回结果。

  根据搜索结果来源的不同,全文搜索引擎可分为两类,一类拥有自己的网页抓取、索引、检索系统(Indexer),有独立的“蜘蛛”(Spider)程序、或爬虫(Crawler)、或“机器人”(Robot)程序(这三种称法意义相同),能自建网页数据库,搜索结果直接从自身的数据库中调用,上面提到的Google和百度就属于此类;另一类则是租用其他搜索引擎的数据库,并按自定的格式排列搜索结果,如Lycos搜索引擎。
目录索引

  目录索引虽然有搜索功能,但严格意义上不能称为真正的搜索引擎,只是按目录分类的网站链接列表而已。用户完全可以按照分类目录找到所需要的信息,不依靠关键词(Keywords)进行查询。目录索引中最具代表性的莫过于大名鼎鼎的Yahoo、新浪分类目录搜索。

元搜索引擎

元搜索引擎(META Search Engine)接受用户查询请求后,同时在多个搜索引擎上搜索,并将结果返回给用户。著名的元搜索引擎有InfoSpace、Dogpile、Vivisimo等,中文元搜索引擎中具代表性的是搜星搜索引擎。在搜索结果排列方面,有的直接按来源排列搜索结果,如Dogpile;有的则按自定的规则将结果重新排列组合,如Vivisimo。
全文搜索引擎的基本原理


具体再详细的概念参照baidu吧 搜索引擎

lucenne

java领域的全文搜索的工具包lucene不仅可以对文本数据进行搜索,还可以对html,excel和pdf等格式的文件建立索引并且进行搜索。

Hibernate search底层使用的就是 lucene。

http://lucene.apache.org

--------------------------------------------------------------------------------------------------------------------------------

上述都属于概念

Hibernate Search特点

支持索引数据的自动更新

支持众多的搜索方式,使用关键词进行搜索,也可以使用通配符进行搜索,还可以使用近似或者同义词进行搜索

支持搜索集群

支持对Lucene API直接的调用

Hibernate Search的类库
hibernate-search.jar
lucene-core.jar
hibernate-commons-annotations.jar

需要修改Hibernate.cfg.xml配置使用Hibernate Search

Xml代码 
<property name="hibernate.search.default.directory_provider"> 
            org.hibernate.search.store.FSDirectoryProvider      
        </property> 
        <property name="hibernate.search.default.indexBase"> 
            D:/temp/index      
         </property> 
        <mapping resource="com/rbh/examples/Guestbook.hbm.xml" /> 
        <event type="post-update"> 
            <listener class="org.hibernate.search.event.FullTextIndexEventListener" /> 
        </event> 
        <event type="post-insert"> 
            <listener class="org.hibernate.search.event.FullTextIndexEventListener" /> 
        </event> 
        <event type="post-delete"> 
            <listener class="org.hibernate.search.event.FullTextIndexEventListener" /> 
        </event> 
        <event type="post-collection-recreate"> 
            <listener class="org.hibernate.search.event.FullTextIndexEventListener" /> 
        </event> 
        <event type="post-collection-remove"> 
            <listener class="org.hibernate.search.event.FullTextIndexEventListener" /> 
        </event> 
        <event type="post-collection-update"> 
            <listener class="org.hibernate.search.event.FullTextIndexEventListener" /> 
        </event> 
修改持久化类,使用注解配置全文索引

Java代码 
@Indexed 
public class Guestbook implements java.io.Serializable {  
.............  
    @DocumentId  //表示这个对象的主键  
    public Integer getId() {  
        return this.id;  
    }  
 
    @Field(store = Store.YES)  
    public String getName() {  
        return this.name;  
    }  
...............  

对持久化对象建立索引

Java代码 
Session session = HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();  
session.getTransaction().begin();  
FullTextSession ftSession = org.hibernate.search.Search.getFullTextSession(session);  
List<Guestbook> guestbooks = session.createQuery("from Guestbook").list();  
for (Guestbook gb : guestbooks) {  
   ftSession.index(gb);  
}  
ftSession.getTransaction().commit(); 
搜索全文索引后的持久化对象

Java代码 
QueryParser parser = new QueryParser("title", new StandardAnalyzer());  
org.apache.lucene.search.Query luceneQuery = null;  
try {  
    luceneQuery = parser.parse("title:test"); // build Lucene query  
} catch (ParseException e) {  
    e.printStackTrace();  
}  
 
Session session = HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();  
session.getTransaction().begin();  
FullTextSession ftSession = org.hibernate.search.Search.getFullTextSession(session);  
org.hibernate.Query query = ftSession.createFullTextQuery(luceneQuery, Guestbook.class);  
query.setMaxResults(20);  
query.setFirstResult(0);  
List<Guestbook> guestbooks = query.list();  
for (Guestbook gb : guestbooks) {  
    printGuestbook(gb);  
}  
 
ftSession.getTransaction().commit(); 


使用luke工具,查看索引数据

Luke是一款显示Lucene索引数据、修改Lucene索引数据和进行模拟搜索的开源工具

注意:现在版本为luke-src-0.9.9,下载后也为lukeall0.9.9.jar cmd下无法运行lukeall0.9.9.jar 改名为lukeall.jar,运行java -jar lukeall.jar 即可

中文分词

把中文的句子切分成有意义的词,这就是中文分词



中文分词的基本机制

一种使用词库匹配
另一种使用自动切分算法



词库切分与自动切分的比较



Hibernate Search 使用第三方的中文分词组件

"庖丁解牛"分词组件-------下载地址http://code.google.com/p/paoding/

配置"庖丁解牛"分词组件

新建paoding-dic-home.properties,文件添加

Xml代码 
paoding.dic.home=D:/hibernate_test/paoding-analysis-2.0.4-beta/dic 
修改持久化类中注解

Java代码 
......  
@Indexed 
@Analyzer(impl = net.paoding.analysis.analyzer.PaodingAnalyzer.class)  
public class Guestbook implements java.io.Serializable {  
.......  

发表评论
用户名: 匿名