- 浏览: 1008048 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (394)
- OSGI (14)
- 多线程 (10)
- 数据库 (30)
- J2ME (1)
- JAVA基础知识 (46)
- 引用包 (1)
- 设计模式 (7)
- 工作流 (2)
- Ubuntu (7)
- 搜索引擎 (6)
- QT (2)
- Ubuntu下编程 (1)
- 小程序 (2)
- UML (1)
- Servlet (10)
- spring (16)
- IM (12)
- 文档视频转为flash格式在线播放 (19)
- Maven (8)
- 远程调用 (2)
- PHPRPC (1)
- EXTJS学习 (2)
- Hibernate (16)
- 技术文章 (38)
- flex (5)
- 海量数据处理 (5)
- FTP (8)
- JS (10)
- Struts (1)
- hibernate search (13)
- JQuery (2)
- EMail (3)
- 算法 (4)
- SVN (7)
- JFreeChart (4)
- 面试 (4)
- 正规表达式 (2)
- 数据库性能优化 (10)
- JVM (6)
- Http Session Cookie (7)
- 网络 (12)
- Hadoop (2)
- 性能 (1)
最新评论
-
hy1235366:
能够随便也发一下,你退火算法程序使用的DistanceMatr ...
模拟退火算法总结(含例子)(转) -
梅强强:
感谢分享。。帮大忙了
swftools转换文件时线程堵塞问题的解决方法 -
wenlongsust:
openoffice和文件不在同一个服务器上,用过吗?
[JODConverter]word转pdf心得分享(转) -
2047699523:
如何在java Web项目中开发WebService接口htt ...
利用Java编写简单的WebService实例 -
abingpow:
唉,看起来好像很详细很不错的样子,可惜不是篇面向初学者的文章, ...
Spring与OSGi的整合(二)(转)
以下的代码是根据api帮助文档作出的一个简单实例,在应用方面可以实现创建索引,搜索,过滤和高亮的功能。
整体的环境为:spring2.5.6,hibernate3.3.1,struts2.0.8,lucene2.4.1
第一步,首先是web.xml配置文件,由于使用了ssh2的架构,所以不得不在web.xml里配置一些东西
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- spring的配置文件路径 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:spring/*.xml</param-value> </context-param> <!--Hibernate Open Session in View Filter--> <filter> <filter-name>hibernateFilter</filter-name> <filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </filter-class> </filter> <filter-mapping> <filter-name>hibernateFilter</filter-name> <url-pattern>*.action</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping> <filter-mapping> <filter-name>hibernateFilter</filter-name> <url-pattern>*.jsp</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <!-- Spring 刷新Introspector防止内存泄露 --> <listener> <listener-class> org.springframework.web.util.IntrospectorCleanupListener </listener-class> </listener> <!-- Struts Action Mapping--> <filter> <filter-name>struts-cleanup</filter-name> <filter-class> org.apache.struts2.dispatcher.ActionContextCleanUp </filter-class> </filter> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name>struts-cleanup</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.jsp</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.action</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping> <!-- spring自带的字符转换过滤器,转换成utf-8的格式 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class> org.springframework.web.filter.CharacterEncodingFilter </filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 随服务器启动,自动调用对应的servlet创建索引文件 --> <servlet> <servlet-name>CreateHibernateIndex</servlet-name> <servlet-class>com.test.servlet.CreateHibernateIndex</servlet-class> <load-on-startup>20</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CreateHibernateIndex</servlet-name> <url-pattern>/servlet/CreateHibernateIndex</url-pattern> </servlet-mapping> <!-- session超时定义,单位为分钟 --> <session-config> <session-timeout>20</session-timeout> </session-config> <!-- 默认首页定义 --> <welcome-file-list> <welcome-file>/index.jsp</welcome-file> </welcome-file-list> </web-app>第二步,配spring配置文件和hibernate文件
这是可以使用hibernate annotation注释的sessionFactory的属性配置的一部分,注意下面的2个使用索引的属性配置,提供文件索引的保存路径和读取方式(fsdirectory,文件索引,另外一种是ramdirectory,内存索引)
<prop key="hibernate.search.default.directory_provider"> org.hibernate.search.store.FSDirectoryProvider </prop> <prop key="hibernate.search.default.indexBase"> ${hibernate.search.default.indexBase} </prop>spring的配置文件没有什么特别的,和普通ssh配置没有什么两样
第三步配struts配置文件,由于也是普通配置,没有特别之处,就不贴出来了。
第四步,写实体类,由于采用hibernate search方法搜索,所以直接利用hibernate annotation注释去定义索引的一些配置信息。关于index的基本都属于索引的配置
package com.test.model; import static javax.persistence.GenerationType.IDENTITY; import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; import org.hibernate.search.annotations.Analyzer; import org.hibernate.search.annotations.DateBridge; import org.hibernate.search.annotations.DocumentId; import org.hibernate.search.annotations.Field; import org.hibernate.search.annotations.Index; import org.hibernate.search.annotations.Indexed; import org.hibernate.search.annotations.Resolution; import org.hibernate.search.annotations.Store; import org.wltea.analyzer.lucene.IKAnalyzer; /** * Product entity. */ @Entity @Table(name = "product", catalog = "hibernate_search_test") @Indexed(index = "Product") @Analyzer (impl = IKAnalyzer.class ) public class Product implements java.io.Serializable { // Fields /** * */ private static final long serialVersionUID = -7005490272739421758L; private Integer id; private String proTitle; private String proDescn; private String proPrice; private Integer proType; private Date proTime; private String findResult; // Constructors /** default constructor */ public Product() { } // Property accessors @Id @GeneratedValue(strategy = IDENTITY) @Column(name = "id") @DocumentId public Integer getId() { return this.id; } public void setId(Integer id) { this.id = id; } @Column(name = "pro_title") @Field(name = "pt", index = Index.TOKENIZED, store = Store.YES) public String getProTitle() { return this.proTitle; } public void setProTitle(String proTitle) { this.proTitle = proTitle; } @Column(name = "pro_descn") @Field(name = "pd", index = Index.TOKENIZED, store = Store.YES) public String getProDescn() { return this.proDescn; } public void setProDescn(String proDescn) { this.proDescn = proDescn; } @Column(name = "pro_price") public String getProPrice() { return this.proPrice; } public void setProPrice(String proPrice) { this.proPrice = proPrice; } @Column(name = "pro_type") public Integer getProType() { return this.proType; } public void setProType(Integer proType) { this.proType = proType; } @Temporal(TemporalType.DATE) @Column(name = "pro_time") @Field(name = "t", index = Index.UN_TOKENIZED, store = Store.YES) @DateBridge(resolution = Resolution.DAY) public Date getProTime() { return this.proTime; } public void setProTime(Date proTime) { this.proTime = proTime; } //封装搜索出的高亮内容 @Transient public String getFindResult() { return findResult; } public void setFindResult(String findResult) { this.findResult = findResult; } }
第六步,写service方法,包括建索引,根据关键字用索引查,过滤,设置权重,高亮等等工作
package com.test.service; import java.io.File; import java.io.StringReader; import java.util.Date; import java.util.List; import javax.annotation.Resource; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.Token; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.document.DateTools; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.DateTools.Resolution; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.Term; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.CachingWrapperFilter; import org.apache.lucene.search.Filter; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.QueryWrapperFilter; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.TermRangeQuery; import org.apache.lucene.search.TopScoreDocCollector; import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.search.highlight.Formatter; import org.apache.lucene.search.highlight.Highlighter; import org.apache.lucene.search.highlight.QueryScorer; import org.apache.lucene.search.highlight.SimpleFragmenter; import org.apache.lucene.search.highlight.SimpleHTMLFormatter; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; import org.hibernate.CacheMode; import org.hibernate.FlushMode; import org.hibernate.ScrollMode; import org.hibernate.ScrollableResults; import org.hibernate.search.FullTextQuery; import org.hibernate.search.FullTextSession; import org.hibernate.search.Search; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springside.modules.orm.hibernate.HibernateDao; import org.springside.modules.service.EntityManager; import org.wltea.analyzer.lucene.IKAnalyzer; import com.test.dao.ProductDao; import com.test.model.Product; @Transactional @Service public class ProductService extends EntityManager<Product, Integer> { @Resource(name = "productDao") private ProductDao productDao; @Override protected HibernateDao<Product, Integer> getEntityDao() { // TODO Auto-generated method stub return productDao; } @SuppressWarnings("unchecked") public List<Product> QueryByIndex(String words, String startDate,String endDate) throws Exception { FullTextSession fullTextSession = Search.createFullTextSession(productDao.getSession()); /*Query IKQuery = IKQueryParser.parseMultiField(new String[] { "proTitle", "proDescn" }, new String[] { words, words }, new BooleanClause.Occur[] { Occur.SHOULD, Occur.SHOULD }); Query luceneQuery = MultiFieldQueryParser.parse(new String[] { words, words }, new String[] { "pro_title", "pro_descn" }, new BooleanClause.Occur[] { Occur.SHOULD, Occur.SHOULD }, new StandardAnalyzer());*/ BooleanQuery bQuery = new BooleanQuery(); Analyzer analyzer = new IKAnalyzer(); //设置对域采用的某种分词器的QueryParser对象 QueryParser qp; //设置了关键字的查询您对象 //Query q; qp = new QueryParser(Version.LUCENE_CURRENT,"pt",analyzer); Query q1 = qp.parse(words); q1.setBoost(1.5f); bQuery.add(q1, Occur.SHOULD); qp = new QueryParser(Version.LUCENE_CURRENT,"pd",analyzer); Query q2 = qp.parse(words); q2.setBoost(1.0f); bQuery.add(q2, Occur.SHOULD); FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(bQuery,Product.class); // 添加是或者否的条件到query中 boolean filterResult = false; BooleanQuery bQueryForFilter = new BooleanQuery(); if (!startDate.equalsIgnoreCase("") && !endDate.equalsIgnoreCase("")) { // 时间过滤 // RangeFilter rangefilter = new RangeFilter("pro_time", // "20090927","20090929", false, false); // 只能使用一个过滤器,所以只能用下面的RangeQuery,然后将所有query封装到一个过滤条件中 TermRangeQuery rangeQuery = new TermRangeQuery("t",startDate,endDate,true,true); bQueryForFilter.add(rangeQuery, BooleanClause.Occur.MUST); filterResult = true; } if (filterResult) { // 将booleanQuery封装到Filter中 Filter filter = new CachingWrapperFilter(new QueryWrapperFilter(bQueryForFilter)); fullTextQuery.setFilter(filter); } List<Product> result = fullTextQuery.list(); String findResult; //根据上边已经写好的query封装出一个查询计分器 QueryScorer qs1 = new QueryScorer(q1); QueryScorer qs2 = new QueryScorer(q2); //设置高亮的模板,其实就是在关键字两边加一对html的格式标签,下面是最基本的加粗。 Formatter formatter = new SimpleHTMLFormatter("<b>", "</b>"); Highlighter highlighter1 = new Highlighter(formatter,qs1); Highlighter highlighter2 = new Highlighter(formatter,qs2); String text; //下面通过将上面根据关键字,过滤条件和权重排序等找出的结果集做一次循环,进行高亮,把高亮后得到的 //一个字符串,封装如每个实体类中的一个额外字段,方便在页面输出。 for(Product product:result){ text = product.getProTitle() ; findResult = highlighter1.getBestFragment(analyzer,"pt", text); if(findResult==null){ text = product.getProDescn() ; highlighter2.setTextFragmenter(new SimpleFragmenter(30)); findResult = highlighter2.getBestFragment(analyzer,"pd", text); } product.setFindResult(findResult); } return result; } //下面的方法是用hibernate search的方法来创建索引 public void createIndexByHibernateSearch() { long startTime = new Date().getTime(); int BATCH_SIZE = 1000; FullTextSession s = Search.createFullTextSession(productDao.getSession()); // Transaction tr = s.beginTransaction(); s.setFlushMode(FlushMode.MANUAL); s.setCacheMode(CacheMode.IGNORE); ScrollableResults results = s.createQuery("from Product").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(); } //下面的方法是用lucene的方式来创建索引文件,不过用这种方式创建索引后,也只能使用lucene的方式去进行搜索 @SuppressWarnings("deprecation") public void createIndexByLucene() { try { File fsDir = new File("E:\\indexes\\product"); Analyzer analyzer = new IKAnalyzer(); /* // 内存索引 RAMDirectory ramDir = new RAMDirectory(); IndexWriter ramWriter = new IndexWriter(ramDir, luceneAnalyzer, true, IndexWriter.MaxFieldLength.UNLIMITED); */ IndexWriter fsWriter = new IndexWriter( FSDirectory.open(fsDir), analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED ); fsWriter.setMaxBufferedDocs(1000); fsWriter.setMergeFactor(1000); List<Product> productList = find("from Product"); int size = productList.size(); long startTime = new Date().getTime(); Document doc; for (Product product : productList) { doc = new Document(); doc.add(new Field("pro_title", product.getProTitle(),Field.Store.YES, Field.Index.ANALYZED)); doc.add(new Field("pro_descn", product.getProDescn(),Field.Store.YES, Field.Index.ANALYZED)); if(product.getProTime()!=null) doc.add(new Field("pro_time",DateTools.dateToString( product.getProTime(), Resolution.DAY),Field.Store.YES, Field.Index.NOT_ANALYZED)); fsWriter.addDocument(doc); // 先缓存入内存索引,后写入文件索引 /* ramWriter.addDocument(doc); int i = 1; i++; if (i % 100 == 0 || i == size) { logger.warn("i:" + i); ramWriter.close(); fsWriter.addIndexesNoOptimize(new Directory[] { ramDir }); ramWriter = new IndexWriter(ramDir, new StandardAnalyzer(), true, IndexWriter.MaxFieldLength.UNLIMITED); }*/ } // 自动优化合并索引文件 fsWriter.optimize(); fsWriter.close(); long endTime = new Date().getTime(); System.out.println("一共" + size + ",这花费了" + (endTime - startTime) + " 毫秒来把文档增加到索引里面去!"); } catch (Exception e) { e.printStackTrace(); } } public void SearchByLucene(){ createIndexByLucene(); File fsDir = new File("E:\\luceneIndexes\\product"); Analyzer analyzer = new IKAnalyzer(); try{ // 索引查询 IndexReader reader = IndexReader.open(FSDirectory.open(fsDir), true); // only searching, so read-only=true IndexSearcher isearcher = new IndexSearcher(reader); BooleanQuery booleanQuery = new BooleanQuery(); QueryParser parser; Query query; parser = new QueryParser(Version.LUCENE_CURRENT,"pro_title",analyzer); query = parser.parse("大灯");// 检索词 query.setBoost(1.5f); booleanQuery.add(query, Occur.SHOULD); parser = new QueryParser(Version.LUCENE_CURRENT,"pro_descn",analyzer); query = parser.parse("大灯");// 检索词 query.setBoost(1.0f); booleanQuery.add(query, Occur.SHOULD); BooleanQuery filterBooleanQuery = new BooleanQuery(); TermRangeQuery rangeQuery = new TermRangeQuery("pro_time","20090101","20091101",true,true); filterBooleanQuery.add(rangeQuery, BooleanClause.Occur.MUST); // 将booleanQuery封装到Filter中 Filter filter = new CachingWrapperFilter(new QueryWrapperFilter(filterBooleanQuery)); TopScoreDocCollector collector = TopScoreDocCollector.create(100,true); isearcher.search(booleanQuery,filter,collector); ScoreDoc[] hits = collector.topDocs(0,100).scoreDocs; QueryScorer qs = new QueryScorer(new TermQuery(new Term("pro_title","大灯"))); for(ScoreDoc h:hits){ Document d = isearcher.doc(h.doc); String text = d.get("pro_title") ; Formatter formatter = new SimpleHTMLFormatter("<b>", "</b>"); Highlighter hl = new Highlighter(formatter,qs); System.out.println(hl.getBestFragment(analyzer,"pro_title", text)); //System.out.println("doc:"+h.doc+" \tscore:"+h.score+" \t"+d.get("pro_title")); } System.out.println("命中:" + hits.length); isearcher.close(); }catch(Exception e){ e.printStackTrace(); } } // 查看分词效果 @SuppressWarnings("deprecation") public static void showAnalyzerResult(Analyzer analyzer, String s) throws Exception { StringReader reader = new StringReader(s); TokenStream ts = analyzer.tokenStream(s, reader); Token t = ts.next(); while (t != null) { System.out.print(t.termText() + " "); t = ts.next(); } System.out.println(); } public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("spring/applicationContext.xml"); ProductService service = (ProductService) ctx.getBean("productService"); service.SearchByLucene(); } }
这里最值得注意的是这里使用了date的类型,并加入了查询中去,在属性里要加入@DateBridge注解,它里面的属性resolution可以指定不同形式的日期形式,具体如下:
Resolution.YEAR: yyyy Resolution.MONTH: yyyyMM Resolution.DAY: yyyyMMdd Resolution.HOUR: yyyyMMddHH Resolution.MINUTE: yyyyMMddHHmm Resolution.SECOND: yyyyMMddHHmmss Resolution.MILLISECOND: yyyyMMddHHmmssSSS
所以只要将日期转换为这种格式就可以用日期的范围查询了。
发表评论
-
重建索引
2011-03-24 16:36 2229使用hibernate search后,就会在加载hib ... -
hibernate search 组合搜索方式
2011-03-24 16:06 2387使用hibernate search来搜索一个加入索引的信息时 ... -
lucene3.0范围查找TermRangeQuery(转)
2011-01-24 16:09 2151在lucene3.0中,范围查询也有很大的变化,Range ... -
日期范围查询之hibernate search DateBridge使用
2011-01-24 15:54 4389hibernate search 使用串和数的索引和查询都比较 ... -
hibernate search手动建索引和组合条件搜索(转)
2011-01-21 14:03 2208近日需要做一下搜索的功能,之前就听说过hibernate se ... -
hibernate-search-3.3.0.Final中文文档翻译及学习笔记(转)
2011-01-10 13:48 2317开始只是自己看,没想到要翻译,从第四章开始进行翻译,主要章节基 ... -
基于Spring的Hibernate Search全文检索功能(转)
2011-01-05 15:28 3914最近的一个项 ... -
Hibernate Search ClassBridge来解决附件同步索引的问题(转)
2010-12-16 09:46 1838我有个类 Issue,但是它的附件并不放在数据库当中,而是放在 ... -
将文件内容加入索引
2010-12-07 17:20 1290上一篇是使用hibernate search的一个文档说明, ... -
Field Bridge 将上传文件内容加入全文检索(转)
2010-12-07 09:28 1455下面是转载hibernate search的使用文档,例子有些 ... -
hibernate search 学习笔记
2010-12-02 13:20 17291 使用hibernate search 时,当你的字段加入了 ... -
Web开发教程12-Hibernate Search(转)
2010-12-02 12:58 3487Hibernate Search是Hibernat ...
相关推荐
hibernate search 和lucene结合使用实例
在Hibernate Search中,你可以使用Lucene的查询语法或者直接使用对象查询语言(OQL)进行全文搜索。以下是一个示例: ```java FullTextSession session = Search.getFullTextSession(entityManager); session....
当这两个强大的工具结合,通过Hibernate Search模块,我们可以实现高效、灵活的全文检索功能。本示例将详细介绍如何在基于Spring的应用中集成Hibernate Search。 **一、Spring与Hibernate Search简介** 1. **...
标题:hibernate_search.pdf 描述与标签:此文档详细介绍了...通过上述知识点,读者可以全面了解Hibernate Search的功能、架构、配置和使用技巧,从而在实际项目中有效应用全文搜索技术,提升数据检索的准确性和效率。
在源码层面,我们可以看到Hibernate Search是如何将ORM的便捷性与搜索引擎的高效性结合起来的。 **2. 源码结构** `hibernate-search-3.4.0.Final`版本包含了以下关键组件: - `engine`: Hibernate Search的主要实现...
Hibernate Search是一个强大的搜索引擎,它整合了Lucene库,使得开发人员能够利用Lucene的强大功能,同时保持与Hibernate ORM的无缝集成。这使得我们能够在数据库中的对象模型上实现全文搜索、近似搜索、范围查询等...
7. **文档与示例**:此版本提供的说明文档详尽地介绍了如何配置、使用和调试Hibernate Search,同时还包含了一些实例代码,帮助开发者快速上手。 综上所述,Hibernate Search 5.5.5.Final为Java开发者提供了一套...
5. **查询API**:深入学习Lucene查询语言和Hibernate Search的Query DSL,包括布尔组合查询、短语查询、模糊查询、范围查询以及使用函数和评分。 6. **分析器与文本处理**:理解分析器的作用,如何选择合适的分析器...
Java搜索工具——Lucene实例总结(一) Lucene是一个高性能、全文检索库,由Apache软件基金会开发并维护。它是开源的Java库,可以方便地在应用程序中实现强大的搜索功能。这篇博客将对Lucene的基本使用进行实例总结,...
分析器是 Lucene 和 Hibernate Search 中非常重要的组件,用于对文本进行预处理(如分词、去除停用词等)以提高搜索效率和准确性。Hibernate Search 支持自定义分析器。 #### 三、架构设计 ##### 3.1 概览 ...
Hibernate Search是基于Apache Lucene库构建的,允许开发者在Hibernate ORM对象上进行全文搜索和索引。它将数据库数据与搜索引擎紧密结合,使开发者能方便地在数据库中实现复杂的搜索功能。 2. **主要特性** - **...
例如,Elasticsearch 和 Solr 这两个流行的全文搜索引擎都是基于 Lucene 构建的,它们提供了更高级的管理和部署功能。 **总结:** Lucene.jar 架包是构建全文检索应用的基础,结合其他扩展库(如 Compass 和 ...
- **Hibernate Search**:允许在数据库中进行全文本搜索,提供了基于Lucene的搜索引擎。 4. **使用步骤** - 配置Hibernate:设置hibernate.cfg.xml文件,定义数据库连接信息、方言、缓存等。 - 创建实体类:每个...
9. **hibernate-search**: 集成了全文搜索引擎,例如Lucene,使得在Hibernate中实现复杂的数据搜索变得简单。 10. **hibernate-types**: 提供了对非标准数据库类型(如JSON、UUID、数组等)的支持,扩展了Hibernate...
3. **Hibernate Search**:这是一个可选模块,它结合了Lucene搜索引擎,使得可以在数据库中进行全文本搜索。 4. **Hibernate Envers**:提供审计功能,记录实体的变化历史,方便追溯和审计数据修改。 5. **...
4. **整合Hibernate Search**:配置`persistence.xml`,添加索引目录,并在实体类上使用@Indexed和@Field注解进行标记。 5. **Spring与Hibernate整合**:在Spring配置文件中配置Hibernate SessionFactory,使用...
1. **实体类**:实体类是数据库表的映射,使用Hibernate Search的注解来定义索引字段和分析器。 2. **配置文件**:通常包括`persistence.xml`,配置Hibernate Search的相关属性,如索引存储位置、索引更新策略等。 3...
1. **分布式架构**:Elasticsearch基于Lucene构建,采用分片和副本机制实现横向扩展,可以处理海量数据并保证数据的高可用性。 2. **RESTful API**:Elasticsearch通过HTTP协议提供RESTful接口,便于与其他系统集成...
- 可以通过构建Lucene查询或Hibernate Search查询来实现复杂的查询需求。 #### 四、分析器(Analyzer) 1. **分析器定义**: - 分析器用于控制文本的解析和索引方式。 - 可以自定义分析器以满足特定的需求。 2...