`

最新SH、Lucene3、IKAnalyzer3.2.3整合实例

阅读更多
Spring3.1, Hibernate3.6,Lucene3.0.3以及IKAnalyzer3.2.3, 数据库采用Mysql,连接池采用dbcp.主要Jar如下:




Spring重要Bean配置:
<!--配置定时任务 -->
<bean id="bagnetTask"
		class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject">
			<ref bean="bagnetJob" />
		</property>
		<property name="targetMethod">
			<value>runJobs</value>
		</property>
		<!-- keep the job from running while the previous one hasn't finished yet -->
		<property name="concurrent" value="false" />
	</bean>

<!--配置定时任务触发器 -->

<bean id="jobTrigger"
		class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail">
			<ref bean="bagnetTask" />
		</property>
		<!-- every 10 mins in the working day from 9:00 to 19:00 we create/update index -->
		<property name="cronExpression">
			<value>0 0/10 9-19 *,* * ?</value>
		</property>
	</bean>
<!-- 定时调用的Scheduler-->
<bean autowire="no"
		class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref local="jobTrigger" />
			</list>
		</property>
	</bean>

<!-- 事务管理器 -->
	<bean id="transactionManger"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory">
			<ref bean="sessionFactory" />
		</property>
	</bean>

	<!--   配置事务拦截器-->
	<bean id="transactionInterceptor"
		class="org.springframework.transaction.interceptor.TransactionInterceptor">
		<property name="transactionManager">
			<ref bean="transactionManger" />
		</property>
		<!--   下面定义事务传播属性-->
		<property name="transactionAttributes">
			<props>
				<prop key="find*">PROPAGATION_REQUIRED</prop>
				<prop key="delete*">PROPAGATION_REQUIRED</prop>
				<prop key="add*">PROPAGATION_REQUIRED</prop>
				<prop key="update*">PROPAGATION_REQUIRED</prop>
				<prop key="do*">PROPAGATION_REQUIRED</prop>
			</props>
		</property>
	</bean>

	<!--  自动代理 -->
	<bean id="autoBeanNameProxyCreator"
		class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
		<property name="beanNames">
			<list>
				<value>*Service</value>
			</list>
		</property>
		<property name="interceptorNames">
			<list>
				<idref local="transactionInterceptor" />
			</list>
		</property>
		<!--  这里的配置是必须的,否则无法完成代理的类型转化 这是使用CGLIB来生成代理 -->
		<property name="proxyTargetClass" value="true" />
	</bean>



Lucene工具类:
package com.dx.bags.util;

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.wltea.analyzer.lucene.IKAnalyzer;

public class LuceneUtil
{
	private static LuceneUtil instance;
	private Analyzer analyzer;
	private Directory picDirectory;
	private Directory topDirectory;

	
	public Analyzer getAnalyzer()
	{
		return analyzer;
	}

	public void setAnalyzer(Analyzer analyzer)
	{
		this.analyzer = analyzer;
	}

	public Directory getPicDirectory()
	{
		return picDirectory;
	}

	public void setPicDirectory(Directory picDirectory)
	{
		this.picDirectory = picDirectory;
	}

	public Directory getTopDirectory()
	{
		return topDirectory;
	}

	public void setTopDirectory(Directory topDirectory)
	{
		this.topDirectory = topDirectory;
	}

	private LuceneUtil()
	{
		analyzer = new IKAnalyzer();
		try
		{
			picDirectory = FSDirectory.open(new File(DXConstants.PIC_INDEX_DIR));
			topDirectory = FSDirectory.open(new File(DXConstants.TOP_INDEX_DIR));
			
		} catch (IOException e)
		{
			throw new RuntimeException(e);
		}
	}

	public static LuceneUtil getInstance()
	{
		if (null == instance)
			instance = new LuceneUtil();
		return instance;
	}

}



建立索引的方法:
	public static void createTopIndex(List<SearchTop> list, boolean isFirstTime)
	{

		RAMDirectory ramDirectory = new RAMDirectory();
		try
		{
			IndexWriter indexwriter = new IndexWriter(ramDirectory, LuceneUtil.getInstance().getAnalyzer(),
					true, IndexWriter.MaxFieldLength.LIMITED);
			if (list != null && list.size() > 0)
			{
				for (int i = 0; i < list.size(); i++)
				{
					Document doc = new Document();
					
					SearchTop searchTop = list.get(i);
					
					Field field = new Field("id", String.valueOf(searchTop.getId()), Field.Store.YES, Field.Index.NO);
					doc.add(field);
					
					String title = DXUtil.characterUtil(searchTop.getTitle());
					if(title!=null && !"".equals(title)){
						field = new Field("title", title, Field.Store.YES, Field.Index.ANALYZED);
						doc.add(field);
					}
					
					String description = searchTop.getDescription();
					if(description!=null && !"".equals(description)){
						field = new Field("description", description, Field.Store.NO,Field.Index.ANALYZED);
						doc.add(field);
					}
					
					field = new Field("cid", String.valueOf(searchTop.getCid()), Field.Store.YES, Field.Index.NOT_ANALYZED);
					doc.add(field);
					
					field = new Field("addtime", String.valueOf(searchTop.getCreateDate()), Field.Store.YES, Field.Index.NOT_ANALYZED);
					doc.add(field);
					
					String content = DXUtil.characterUtil(searchTop.getContents());
					if(content!=null && !"".equals(content)){
						field = new Field("contents", content, Field.Store.NO, Field.Index.ANALYZED);
						doc.add(field);
					}
					
					field = new Field("sex", String.valueOf(searchTop.getSex()), Field.Store.YES, Field.Index.NOT_ANALYZED);
					doc.add(field);
					
					field = new Field("tid",String.valueOf(searchTop.getTid()),Field.Store.YES,Field.Index.NOT_ANALYZED);
					doc.add(field);
					
					field = new Field("topicid", String.valueOf(searchTop.getTopicId()), Field.Store.YES, Field.Index.ANALYZED);
					doc.add(field);
					
					field = new Field("piccount", String.valueOf(searchTop.getPiccount()), Field.Store.YES, Field.Index.NOT_ANALYZED);
					doc.add(field);
					
					String city = DXUtil.characterUtil(searchTop.getCityName());
					if(city!=null && !"".equals(city)){
						field = new Field("cityname", city, Field.Store.YES, Field.Index.ANALYZED);
						doc.add(field);
					}
					
					field = new Field("purview", dealPurview(searchTop.getSex(), searchTop.getCid()), Field.Store.YES, Field.Index.NOT_ANALYZED);
					doc.add(field);
					
					String seasonname = DXUtil.characterUtil(searchTop.getSeasonName());
					if(seasonname!=null && !"".equals(seasonname)){
						field = new Field("seasonname", seasonname, Field.Store.YES, Field.Index.ANALYZED);
						doc.add(field);
					}
					
					String recordurl = dealTopUrl(searchTop.getSex(), searchTop.getCid(), searchTop.getTid());
					if(recordurl!=null && !"".equals(recordurl)){
						field = new Field("recordurl", recordurl, Field.Store.YES, Field.Index.NOT_ANALYZED); 
						doc.add(field);
					}
					
					indexwriter.addDocument(doc);
				}
			}
			indexwriter.optimize();
			indexwriter.close();
			
			IndexWriter writer = new IndexWriter(LuceneUtil.getInstance()
					.getTopDirectory(), LuceneUtil.getInstance()
					.getAnalyzer(), isFirstTime, IndexWriter.MaxFieldLength.LIMITED);
			writer.addIndexesNoOptimize(new Directory[] { ramDirectory });
			writer.close();
		} catch (CorruptIndexException e)
		{

			throw new RuntimeException(e);
		} catch (IOException ex)
		{
			throw new RuntimeException(ex);
		}
	}


对增量数据循环建立索引:
private void createTopIndex() {
		long count = searchTopService.findTotalRecordNum();
		boolean flag = DXUtil.hasNotFile(new File(DXConstants.TOP_INDEX_DIR));
		List<SearchTop> tops = new ArrayList<SearchTop>();
		int max = DXConstants.PAGE_SIZE;
		int first = Integer.parseInt(DXUtil
				.getRecordNumFromFile(DXConstants.TOP_TXT));
		while (first < count) {
			tops = searchTopService.findTopToIndex(first, max);
			first = first + max;
			IndexCreator.createTopIndex(tops, flag);
			if(flag == true)
				flag = false;
			DXUtil.writeContent(String.valueOf(first), DXConstants.TOP_TXT);
		}
		if (first >= count)
			DXUtil.writeContent(String.valueOf(count), DXConstants.TOP_TXT);
		optimiseTopicIndex(flag);
	}

//optimize index
private void optimiseTopicIndex(boolean flag) {
		IndexWriter writer = null;
		try {
			writer = new IndexWriter(
					LuceneUtil.getInstance().getTopDirectory(), LuceneUtil
							.getInstance().getAnalyzer(), flag,
					IndexWriter.MaxFieldLength.LIMITED);
			writer.optimize();
			writer.close();

		} catch (Exception e) {

		}

	}



主要代码以备忘。








  • 大小: 62.8 KB
2
1
分享到:
评论

相关推荐

    模糊查询-lucene-IKAnalyzer

    通过阅读和理解这些代码,你可以了解到如何在实际项目中整合Lucene和IKAnalyzer,实现模糊查询的功能。 在开发过程中,确保正确地配置了Lucene和IKAnalyzer的依赖,并且理解它们的工作原理是非常关键的。对于模糊...

    org.wltea.analyzer.lucene.IKAnalyzer jar

    solr的IK分词器JAR及配置文件 jar包和配置文件的放置位置不一样,详情可搜索 IK Analyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包。...org.wltea.analyzer.lucene.IKAnalyzer jar

    lucene3.5 IKAnalyzer3.2.5 实例中文分词通过

    lucene3.5 IKAnalyzer3.2.5 实例中文分词通过,目前在网上找的lucene 和IKAnalyzer 的最新版本测试通过。内含:示例代码,以及最新jar包。 lucene lucene3.5 IKAnalyzer IKAnalyzer3.2.5 jar 中文 分词

    IKAnalyzer 支持高版本最新Lucene 5.x、6.x、7.x

    在给定的标题和描述中,我们看到IKAnalyzer已经更新以支持Lucene的高版本,包括5.x、6.x以及最新的7.3.1版本,这表明它持续跟进了Lucene的发展,确保与主流搜索引擎框架的兼容性。 1. **IKAnalyzer详解**: - IK...

    中文分词检索IKAnalyzer3.2.3Stable+hibernate-search3.4.0.Final

    综上所述,该系统通过整合Spring 3.0.5、Hibernate 3.6.7、Hibernate Search 3.4.0.Final以及IKAnalyzer 3.2.3 Stable等组件,实现了中文文本的高效全文检索功能。其中,IKAnalyzer负责中文分词处理,提高了检索的...

    IKAnalyzer中文分词支持lucene6.5.0版本

    由于林良益先生在2012之后未对IKAnalyzer进行更新,后续lucene分词接口发生变化,导致不可使用,所以此jar包支持lucene6.0以上版本

    Lucene的IK Analyzer 3.0 中文分词器 全解

    - 使用IK Analyzer 需要导入Analyzer类,并实例化IKAnalyzer对象。然后在创建索引和执行查询时使用这个Analyzer,这样可以确保中文文本被正确地分词处理。 总之,IK Analyzer 3.0 是一个强大而灵活的中文分词工具...

    lucene的IKAnalyzer以及兼容4.3

    IKAnalyzer会定期发布新版本,以适配最新版的Lucene。 2. **修改代码**:检查并修改项目中涉及Lucene API的部分,以适应新版本的API变化。 3. **使用桥接类**:有时,开发者可以利用Lucene提供的桥接类来兼容旧版...

    Lucene5.21+IkAnalyzer

    《Lucene5.21与IkAnalyzer2012_V5入门详解》 在信息技术领域,数据检索和搜索引擎是至关重要的部分,而Lucene和IkAnalyzer则是其中的两大利器。本文将详细介绍如何使用Lucene 5.21版本结合IkAnalyzer 2012_V5进行...

    IKAnalyzer6.5.0.jar

    3. **配置文件**:`IKAnalyzer.cfg.xml` 是IK Analyzer的配置文件,用户可以通过修改这个文件来调整分词器的行为,例如设置分词模式(精确模式、全模式、快速模式)、指定自定义词典路径等。 4. **项目构建相关文件...

    IKAnalyzer2012_FF_hf1.jar

    解决lucene4.0与IKAnalyzer的冲突。解决Exception in thread "main" java.lang.VerifyError: class org.wltea.analyzer.lucene.IKAnalyzer overrides final method tokenStream.(Ljava/lang/String;Ljava/io/Reader;...

    lucene增删改查+IKAnalyzer

    《深入理解Lucene与IKAnalyzer:构建全文搜索引擎》 在信息技术高速发展的今天,数据的存储与检索变得至关重要。Lucene,作为一个开源的全文检索库,为开发者提供了强大的文本搜索功能。而IKAnalyzer作为针对中文...

    lucene5和IKAnalyzer5的jar包 相匹配

    《深入理解Lucene5与IKAnalyzer5:构建高效全文搜索引擎》 在信息技术高速发展的今天,搜索引擎已经成为信息获取的重要工具。Lucene和IKAnalyzer作为Java领域内广泛应用的全文检索库和中文分词器,它们的结合为开发...

    中文分词库 IKAnalyzer For Lucene 5.2.1(适用Lucene 5.2.1)

    IKAnalyzer 是一个专门为 Lucene 设计的开源中文分词库,它在中文处理领域有着广泛的应用。这个版本的 IKAnalyzer 特别适用于 Lucene 5.2.1,这意味着它与该版本的 Lucene 兼容性极佳,能够提供高效、准确的中文分词...

    Lucene4.7+IK Analyzer中文分词入门教程

    【Lucene4.7+IK Analyzer中文分词入门教程】 Lucene是一个开源的全文检索库,它提供了文本分析、索引和搜索的核心工具。在这个入门教程中,我们将使用Lucene 4.7版本,结合IK Analyzer,一个专门针对中文分词的开源...

    lucene-IKAnalyzer2012_u6-lukeall.rar

    lucene-IKAnalyzer2012_u6-lukeall.rar压缩包中包含lucene-4.10.3依赖包、中文分词器IKAnalyzer2012_u6的依赖包和索引库查看工具lukeall-4.10.0.jar(将jar拷贝到相应的索引库中双击打开即可查看)。解压后就可以...

    IKAnalyzer中文分词器支持Lucene6.0以上

    提示:IKAnalyzer中文分词器支持Lucene6.0以上,IKAnalyzer中文分词器支持Lucene6.0以上。

    ikanalyzer中文分词支持lucene7.1.0

    总的来说,ikanalyzer中文分词支持lucene7.1.0是为了解决旧版ikanalyzer与新Lucene版本的兼容性问题而推出的,它使得开发者能够充分利用Lucene的最新特性,同时保持ikanalyzer的优秀分词性能,对于处理中文内容的...

    适用于Lucene5.3.1的IKAnalyzer jar包

    该jar包之前只支持Lucene4.7.2,因为我自己的项目用到的是Lucene5.3.1,所以我自己重写了IKAnalyzer.java以及IKTokenizer.java,并且重新编译之后替换了之前的.class文件,现在可以适用于Lucene5.3.1

    IKAnalyzer 支持高版本Lucene 6.x及以上

    来自牛人修改的IKAnalyzer,https://github.com/sea-boat/IKAnalyzer-Mirror,亲测Lucene7.2可用

Global site tag (gtag.js) - Google Analytics