最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java的Hibernate框架中的搜索工具的運(yùn)用

 更新時間:2015年11月30日 08:52:47   作者:開心的D哥  
這篇文章主要介紹了詳解Java的Hibernate框架中的搜索工具的運(yùn)用,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下

hibernate提供了全文索引功能,非常棒,這里簡要介紹下它的用法,
1. 在pom.xml引入包依賴

<dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-search-orm</artifactId>
      <version>${hibernate-search.version}</version>
    </dependency>

    <dependency>
      <groupId>org.apache.lucene</groupId>
      <artifactId>lucene-analyzers-smartcn</artifactId>
      <version>${lucene.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.lucene</groupId>
      <artifactId>lucene-queryparser</artifactId>
      <version>${lucene.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.lucene</groupId>
      <artifactId>lucene-analyzers-phonetic</artifactId>
      <version>${lucene.version}</version>
    </dependency>

hibernate配置 search index保存路徑

 <bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
    destroy-method="destroy">
    <property name="dataSource" ref="poolingDataSource" />
    <property name="configLocation">
      <value> classpath:hibernate.cfg.xml </value>
    </property>
    <property name="hibernateProperties">
      <props>
        <prop key="hibernate.dialect">${hibernate.dialect}</prop>
        <!-- Booleans can be easily used in expressions by 
           declaring HQL query substitutions in Hibernate configuration -->
        <prop key="hibernate.query.substitutions">true 'Y', false 'N'</prop>
        <!-- http://ehcache.org/documentation/integrations/hibernate -->
        <!-- http://www.tutorialspoint.com/hibernate/hibernate_caching.htm -->
        <prop key="hibernate.cache.use_second_level_cache">true</prop>
        <!-- org.hibernate.cache.ehcache.EhCacheRegionFactory -->
        <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
        <!-- hibernate只會緩存使用load()方法獲得的單個持久化對象,如果想緩存使用findall()、 list()、Iterator()、createCriteria()、createQuery()
                等方法獲得的數(shù)據(jù)結(jié)果集的話,就需要設(shè)置hibernate.cache.use_query_cache true -->
        <prop key="hibernate.cache.use_query_cache">true</prop>
        <prop key="net.sf.ehcache.configurationResourceName">ehcache-hibernate.xml</prop>
        <!-- Hibernate Search index directory -->
        ***<prop key="hibernate.search.default.indexBase">indexes/</prop>*** 
      </props>
    </property>
  </bean> 

對需要搜索的類加上Indexed Annotation,然后對類中可以被搜索的字段加上@Field Annotation,通常Enum字段不需要Analyzer進(jìn)行詞法分析,其他字段則需要,對于不需要Projection(返回部分字段)的情況下,不需要在index中存儲實(shí)際數(shù)據(jù)??梢酝ㄟ^AnalyzerDef來定義不同的詞法分析器以及對于的特殊詞過濾器

@Indexed
@AnalyzerDef(
    name="enTopicAnalyzer",
    charFilters={
      @CharFilterDef(factory=HTMLStripCharFilterFactory.class)
    },
    tokenizer=@TokenizerDef(factory=StandardTokenizerFactory.class),
    filters={
      @TokenFilterDef(factory=StandardFilterFactory.class),
      @TokenFilterDef(factory=StopFilterFactory.class),
      @TokenFilterDef(factory=PhoneticFilterFactory.class,
        params = {
          @Parameter(name="encoder", value="DoubleMetaphone")
        }),
      @TokenFilterDef(factory=SnowballPorterFilterFactory.class,
        params = {
          @Parameter(name="language", value="English")
        })
      }
  )
public class Topic {

  ......
  @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
  @Analyzer(definition = "enTopicAnalyzer")
  private String title;
  ......
  @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
  @Analyzer(definition = "enTopicAnalyzer")
  private String content;
  ......  
  @Enumerated(EnumType.STRING)
  @Field(index=Index.YES, analyze=Analyze.NO, store=Store.NO, bridge=@FieldBridge(impl=EnumBridge.class))
  private TopicStatus status;
  ...
  }

通過代碼對已有數(shù)據(jù)創(chuàng)建index

ApplicationContext context = new ClassPathXmlApplicationContext("spring-resources.xml");

    SessionFactory sessionFactory = (SessionFactory) context.getBean("sessionFactory");

    Session sess = sessionFactory.openSession();
    FullTextSession fullTextSession = Search.getFullTextSession(sess);
    try {
      fullTextSession.createIndexer().startAndWait();
    } catch (InterruptedException e) {
       LOG.error(e.getMessage(), e);
    } finally {
      fullTextSession.close();
    }
    ((AbstractApplicationContext)context).close();

創(chuàng)建查詢fulltextsession,按照query條件獲取結(jié)果

 FullTextSession fullTextSession = Search
        .getFullTextSession(getSession());

    QueryBuilder queryBuilder = fullTextSession.getSearchFactory()
        .buildQueryBuilder().forEntity(Show.class).get();
    org.apache.lucene.search.Query luceneQuery = null;

      luceneQuery = queryBuilder.keyword()// .wildcard()
          .onFields("title", "content").matching(query.getKeyword())
          // .matching("*" + query.getKeyword() + "*")
          .createQuery();

    FullTextQuery hibernateQuery = fullTextSession.createFullTextQuery(
        luceneQuery, Show.class);
    return hibernateQuery.list();

note:
1. 在一次測試過程中,修改了value object,添加了新的index,忘記了rebuildIndex,結(jié)果unit test沒問題,生成環(huán)境就出錯了。
2. 搜索還不是很強(qiáng)大,比如搜索測,含有測試的結(jié)果可能就搜索不出來

中文詞法分析

hibernate search底層使用Lucene,所以Lucene可以使用的中文分詞,hibernate search都可以用來支持中文詞法分析,比較常用的詞法分析器包括paoding,IKAnalyzer,mmseg4j 等等。具體可以參考分詞分析 最近分析。hibernate search默認(rèn)的分詞器是org.apache.lucene.analysis.standard.StandardAnalyzer,中文按字分詞,顯然不符合我們的需求。
這里介紹一下如何在hibernate中配置中文分詞,選擇的是Lucene自帶的中文分詞–。使用可以通過3種方式,一種是在hibernate的配置文件設(shè)置詞法分析方法,另外一種是在每個需要被搜索的類中定義分詞方法,最后一種是對單個字段配置。這里介紹下前2種的配置方式。
hibernate配置方式:

<property name="hibernate.search.analyzer"> org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer</property>

被搜索類配置中文分詞:

@Indexed
@Analyzer(impl=SmartChineseAnalyzer.class)

同時需要在maven中引入相關(guān)包依賴

<dependency>
      <groupId>org.apache.lucene</groupId>
      <artifactId>lucene-analyzers-smartcn</artifactId>
      <version>${lucene.version}</version>
    </dependency>

多條件查詢
hibernate search可以通過多組合條件來實(shí)現(xiàn)多條件查詢,這里簡單介紹一下多條件查詢的一個實(shí)踐。
如果只是單個條件查詢,那么這個查詢就可以很簡單

luceneQuery = queryBuilder.keyword().onFields("title", "content").matching(query.getKeyword()).createQuery()

如果是多條件并查詢,那么就需要使用到Must Join,如果是多條件或查詢,就需要使用should Join,這里舉個Must Join的例子

//must true
MustJunction term = queryBuilder.bool().must(queryBuilder.keyword()
          .onFields("title", "content")   .matching(query.getKeyword()).createQuery());
//must false
 term.must(queryBuilder.keyword()
              .onField("status")             .matching(query.getExcludeStatus()).createQuery()).not();

完整例子:

private FullTextQuery findByKeywordQuery(TopicQuery query) {
    FullTextSession fullTextSession = Search
        .getFullTextSession(getSession());


    QueryBuilder queryBuilder = fullTextSession.getSearchFactory()
        .buildQueryBuilder().forEntity(Topic.class).get();
    org.apache.lucene.search.Query luceneQuery = null;
    if (null == query.getStatus() && null == query.getUsername() && null == query.getExcludeStatus()) {
      luceneQuery = queryBuilder.keyword()// .wildcard()
          .onFields("title", "content").matching(query.getKeyword())
          // .matching("*" + query.getKeyword() + "*")
          .createQuery();
      if(LOG.isDebugEnabled()){
        LOG.debug("create clean keyword search query: " + luceneQuery.toString());
      }
    } else {
      MustJunction term = queryBuilder.bool().must(queryBuilder.keyword()
          .onFields("title", "content")   .matching(query.getKeyword()).createQuery());
      if(null != query.getStatus()){
        term.must(queryBuilder.keyword()
              // .wildcard()
              .onField("status")
              .matching(query.getStatus()).createQuery());
      }
      if(null != query.getExcludeStatus()){
        term.must(queryBuilder.keyword()
              .onField("status")
              .matching(query.getExcludeStatus()).createQuery()).not();
      }
      if(null != query.getUsername()){
        term.must(queryBuilder.keyword()
              // .wildcard()
              .onField("owner.username")
               .ignoreFieldBridge()
              .matching(query.getUsername()).createQuery());
      }
      luceneQuery =term.createQuery();
      if(LOG.isDebugEnabled()){
        LOG.debug("create complicated keyword search query: " + luceneQuery.toString());
      }
    }
    // BooleanQuery
    FullTextQuery hibernateQuery = fullTextSession.createFullTextQuery(
        luceneQuery, Topic.class);
    return hibernateQuery;
  }

相關(guān)文章

  • 詳解Spring Cloud Feign 熔斷配置的一些小坑

    詳解Spring Cloud Feign 熔斷配置的一些小坑

    這篇文章主要介紹了詳解Spring Cloud Feign 熔斷配置的一些小坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • java連接ElasticSearch集群操作

    java連接ElasticSearch集群操作

    這篇文章主要介紹了java連接ElasticSearch集群操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • jdk17?SpringBoot?JPA集成多數(shù)據(jù)庫的示例詳解

    jdk17?SpringBoot?JPA集成多數(shù)據(jù)庫的示例詳解

    這篇文章主要介紹了jdk17?SpringBoot?JPA集成多數(shù)據(jù)庫的示例代碼,包括配置類、請求攔截器、線程上下文等相關(guān)知識,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • Java設(shè)計(jì)模式中裝飾者模式應(yīng)用詳解

    Java設(shè)計(jì)模式中裝飾者模式應(yīng)用詳解

    裝飾者模式:在不改變原有對象的基礎(chǔ)之上,動態(tài)的將功能附加到對象上,提供了繼承更有彈性的替代方案,也體現(xiàn)了開閉原則。本文將通過示例詳細(xì)講解一下裝飾者模式,需要的可以參考一下
    2022-11-11
  • SpringBoot項(xiàng)目中枚舉類型字段與前端和數(shù)據(jù)庫的交互方法

    SpringBoot項(xiàng)目中枚舉類型字段與前端和數(shù)據(jù)庫的交互方法

    最近做的這個項(xiàng)目中,用到了大量的枚舉類,下面這篇文章主要給大家介紹了關(guān)于SpringBoot項(xiàng)目中枚舉類型字段與前端和數(shù)據(jù)庫的交互方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • Java多線程饑餓與公平介紹及代碼示例

    Java多線程饑餓與公平介紹及代碼示例

    這篇文章主要介紹了Java多線程饑餓與公平介紹及代碼示例,分析饑餓產(chǎn)生的原因以及相關(guān)實(shí)例,然后就在java中實(shí)現(xiàn)公平性問題做了詳細(xì)解析,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java synchronized重量級鎖實(shí)現(xiàn)過程淺析

    Java synchronized重量級鎖實(shí)現(xiàn)過程淺析

    這篇文章主要介紹了Java synchronized重量級鎖實(shí)現(xiàn)過程,synchronized是Java里的一個關(guān)鍵字,起到的一個效果是"監(jiān)視器鎖",它的功能就是保證操作的原子性,同時禁止指令重排序和保證內(nèi)存的可見性
    2023-02-02
  • 實(shí)例解析Json反序列化之ObjectMapper(自定義實(shí)現(xiàn)反序列化方法)

    實(shí)例解析Json反序列化之ObjectMapper(自定義實(shí)現(xiàn)反序列化方法)

    這篇文章主要介紹了實(shí)例解析Json反序列化之ObjectMapper,json自定義序列化的方法,需要的朋友可以了解下。
    2017-09-09
  • Spring Boot 集成 Kafka的詳細(xì)步驟

    Spring Boot 集成 Kafka的詳細(xì)步驟

    Spring Boot與Kafka的集成使得消息隊(duì)列的使用變得更加簡單和高效,可以配置 Kafka、實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者,并利用 Spring Boot 提供的功能處理消息流,以下是 Spring Boot 集成 Kafka 的詳細(xì)步驟,包括配置、生產(chǎn)者和消費(fèi)者的實(shí)現(xiàn)以及一些高級特性,感興趣的朋友一起看看吧
    2024-07-07
  • Java線上CPU內(nèi)存沖高問題排查解決步驟

    Java線上CPU內(nèi)存沖高問題排查解決步驟

    這篇文章主要介紹了Java線上CPU內(nèi)存沖高問題排查解決步驟的相關(guān)資料,Java程序在實(shí)際生產(chǎn)過程中經(jīng)常遇到CPU或內(nèi)存使用率高的問題,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07

最新評論

贺州市| 根河市| 嵊泗县| 博罗县| 疏勒县| 平顺县| 田阳县| 上蔡县| 武山县| 镇江市| 永清县| 靖远县| 黄骅市| 太康县| 加查县| 阜宁县| 皋兰县| 邵武市| 南木林县| 都兰县| 湾仔区| 海口市| 柳州市| 广宗县| 武功县| 民权县| 呼和浩特市| 清远市| 怀宁县| 沾化县| 贵阳市| 宿松县| 浏阳市| 涟水县| 茌平县| 永吉县| 资兴市| 无锡市| 浪卡子县| 来宾市| 武冈市|