hibernate search初探1

来源:互联网 发布:c语言算术表达式求值 编辑:程序博客网 时间:2024/06/15 03:21

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>
  1. 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()                                等方法获得的数据结果集的话,就需要设置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> 
  1. 对需要搜索的类加上Indexed Annotation,然后对类中可以被搜索的字段加上@Field Annotation,通常Enum字段不需要Analyzer进行词法分析,其他字段则需要,对于不需要Projection(返回部分字段)的情况下,不需要在index中存储实际数据。可以通过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;    ...    }
  1. 通过代码对已有数据创建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();
  1. 创建查询fulltextsession,按照query条件获取结果
 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,结果unit test没问题,生成环境就出错了。
2. 搜索还不是很强大,比如搜索测,含有测试的结果可能就搜索不出来

0 0
原创粉丝点击