`
hz_chenwenbiao
  • 浏览: 1008048 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

hibernate search 和lucene结合使用实例(转)

阅读更多

 

以下的代码是根据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

所以只要将日期转换为这种格式就可以用日期的范围查询了。

 

 

分享到:
评论

相关推荐

    hibernate学习

    hibernate search 和lucene结合使用实例

    hibernate search全文索引的创建及查询

    在Hibernate Search中,你可以使用Lucene的查询语法或者直接使用对象查询语言(OQL)进行全文搜索。以下是一个示例: ```java FullTextSession session = Search.getFullTextSession(entityManager); session....

    基于Spring的Hibernate Search全文检索功能示例

    当这两个强大的工具结合,通过Hibernate Search模块,我们可以实现高效、灵活的全文检索功能。本示例将详细介绍如何在基于Spring的应用中集成Hibernate Search。 **一、Spring与Hibernate Search简介** 1. **...

    hibernate_search.pdf

    标题:hibernate_search.pdf 描述与标签:此文档详细介绍了...通过上述知识点,读者可以全面了解Hibernate Search的功能、架构、配置和使用技巧,从而在实际项目中有效应用全文搜索技术,提升数据检索的准确性和效率。

    hibernate search源码

    在源码层面,我们可以看到Hibernate Search是如何将ORM的便捷性与搜索引擎的高效性结合起来的。 **2. 源码结构** `hibernate-search-3.4.0.Final`版本包含了以下关键组件: - `engine`: Hibernate Search的主要实现...

    hibernate-search-5.5.1.Final-dist.zip

    Hibernate Search是一个强大的搜索引擎,它整合了Lucene库,使得开发人员能够利用Lucene的强大功能,同时保持与Hibernate ORM的无缝集成。这使得我们能够在数据库中的对象模型上实现全文搜索、近似搜索、范围查询等...

    hibernate-search-5.5.5.Final

    7. **文档与示例**:此版本提供的说明文档详尽地介绍了如何配置、使用和调试Hibernate Search,同时还包含了一些实例代码,帮助开发者快速上手。 综上所述,Hibernate Search 5.5.5.Final为Java开发者提供了一套...

    \hibernate search in action.rar

    5. **查询API**:深入学习Lucene查询语言和Hibernate Search的Query DSL,包括布尔组合查询、短语查询、模糊查询、范围查询以及使用函数和评分。 6. **分析器与文本处理**:理解分析器的作用,如何选择合适的分析器...

    Java搜索工具——Lucene实例总结(一)

    Java搜索工具——Lucene实例总结(一) Lucene是一个高性能、全文检索库,由Apache软件基金会开发并维护。它是开源的Java库,可以方便地在应用程序中实现强大的搜索功能。这篇博客将对Lucene的基本使用进行实例总结,...

    hibernate_search

    分析器是 Lucene 和 Hibernate Search 中非常重要的组件,用于对文本进行预处理(如分词、去除停用词等)以提高搜索效率和准确性。Hibernate Search 支持自定义分析器。 #### 三、架构设计 ##### 3.1 概览 ...

    hibernate-search-4.2.0.Beta2-dist.zip

    Hibernate Search是基于Apache Lucene库构建的,允许开发者在Hibernate ORM对象上进行全文搜索和索引。它将数据库数据与搜索引擎紧密结合,使开发者能方便地在数据库中实现复杂的搜索功能。 2. **主要特性** - **...

    lucene.jar架包

    例如,Elasticsearch 和 Solr 这两个流行的全文搜索引擎都是基于 Lucene 构建的,它们提供了更高级的管理和部署功能。 **总结:** Lucene.jar 架包是构建全文检索应用的基础,结合其他扩展库(如 Compass 和 ...

    Hibernate5.2.8提取包

    - **Hibernate Search**:允许在数据库中进行全文本搜索,提供了基于Lucene的搜索引擎。 4. **使用步骤** - 配置Hibernate:设置hibernate.cfg.xml文件,定义数据库连接信息、方言、缓存等。 - 创建实体类:每个...

    hibernate的所有包

    9. **hibernate-search**: 集成了全文搜索引擎,例如Lucene,使得在Hibernate中实现复杂的数据搜索变得简单。 10. **hibernate-types**: 提供了对非标准数据库类型(如JSON、UUID、数组等)的支持,扩展了Hibernate...

    hibernate jar包

    3. **Hibernate Search**:这是一个可选模块,它结合了Lucene搜索引擎,使得可以在数据库中进行全文本搜索。 4. **Hibernate Envers**:提供审计功能,记录实体的变化历史,方便追溯和审计数据修改。 5. **...

    SSH整合简单实例

    4. **整合Hibernate Search**:配置`persistence.xml`,添加索引目录,并在实体类上使用@Indexed和@Field注解进行标记。 5. **Spring与Hibernate整合**:在Spring配置文件中配置Hibernate SessionFactory,使用...

    HiSInAction代码

    1. **实体类**:实体类是数据库表的映射,使用Hibernate Search的注解来定义索引字段和分析器。 2. **配置文件**:通常包括`persistence.xml`,配置Hibernate Search的相关属性,如索引存储位置、索引更新策略等。 3...

    ElasticSearch和activiti案例

    1. **分布式架构**:Elasticsearch基于Lucene构建,采用分片和副本机制实现横向扩展,可以处理海量数据并保证数据的高可用性。 2. **RESTful API**:Elasticsearch通过HTTP协议提供RESTful接口,便于与其他系统集成...

    Hibernate3.4.X 代码快速查询 实体更快 更方便

    - 可以通过构建Lucene查询或Hibernate Search查询来实现复杂的查询需求。 #### 四、分析器(Analyzer) 1. **分析器定义**: - 分析器用于控制文本的解析和索引方式。 - 可以自定义分析器以满足特定的需求。 2...

Global site tag (gtag.js) - Google Analytics