struts2+spring+hibernate+compass 实现全文检索

aikaibo 2009-12-31

Compass是一流的开放源码JAVA搜索引擎框架,对于你的应用修饰,搜索引擎语义更具有能力。依靠顶级的Lucene搜索引擎,Compass结合了,像Hibernate和Sprin的流行的框架,为你的应用提供了从数据模型和数据源同步改变的搜索力.并且添加了2方面的特征,事物管理和快速更新优化.Compass的目标是:把java应用简单集成到搜索引擎中.编码更少,查找数据更便捷。

这里struts2整合spring、hibernate就不说了。贴出compass+spring+hibernate整合的关键代码。

1、对要检索的实体进行可搜索注解:

@Searchable
public class Product implements java.io.Serializable {

	@SearchableId
	private Integer id;
	@SearchableProperty(name="name")
	private String name;
	@SearchableProperty(name="price")
	private Float price;
	@SearchableProperty(name="brand")
	private String brand;
	@SearchableProperty(name="description")
	private String description;

        //getter setter
}

2、建索引类

package cn.changtusoft.s2sh_compass.service.impl;
import org.compass.gps.CompassGps;
import org.springframework.beans.factory.InitializingBean;


/**
 * 通过quartz定时调度定时重建索引或自动随Spring ApplicationContext启动而重建索引的Builder.
 * 会启动后延时数秒新开线程调用compassGps.index()函数.
 * 默认会在Web应用每次启动时重建索引,可以设置buildIndex属性为false来禁止此功能.
 * 也可以不用本Builder, 编写手动调用compassGps.index()的代码.
 *
 */
public class CompassIndexBuilder implements InitializingBean {   
    // 是否需要建立索引,可被设置为false使本Builder失效.
    private boolean buildIndex = false;

    // 索引操作线程延时启动的时间,单位为秒
    private int lazyTime = 10;

    // Compass封装
    private CompassGps compassGps;

    // 索引线程
    private Thread indexThread = new Thread() {

        @Override
        public void run() {
            try {
                Thread.sleep(lazyTime * 1000);
                System.out.println("begin compass index...");
                long beginTime = System.currentTimeMillis();
                // 重建索引.
                // 如果compass实体中定义的索引文件已存在,索引过程中会建立临时索引,
                // 索引完成后再进行覆盖.
                compassGps.index();
                long costTime = System.currentTimeMillis() - beginTime;
                System.out.println("compss index finished.");
                System.out.println("costed " + costTime + " milliseconds");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };

    /**
     * 实现<code>InitializingBean</code>接口,在完成注入后调用启动索引线程.
     *
     * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
     */
    public void afterPropertiesSet() throws Exception {
        if (buildIndex) {
            indexThread.setDaemon(true);
            indexThread.setName("Compass Indexer");
            indexThread.start();
        }
    }

    public void setBuildIndex(boolean buildIndex) {
        this.buildIndex = buildIndex;
    }

    public void setLazyTime(int lazyTime) {
        this.lazyTime = lazyTime;
    }

    public void setCompassGps(CompassGps compassGps) {
        this.compassGps = compassGps;
    }
}

3、Manager

package cn.changtusoft.s2sh_compass.service.impl;

import java.util.ArrayList;
import java.util.List;

import org.compass.core.Compass;
import org.compass.core.CompassHits;
import org.compass.core.CompassSession;
import org.compass.core.CompassTemplate;
import org.compass.core.CompassTransaction;

import cn.changtusoft.s2sh_compass.dao.ProductDao;
import cn.changtusoft.s2sh_compass.model.Product;
import cn.changtusoft.s2sh_compass.service.ProductManager;

public class ProductManagerImpl implements ProductManager {

	private ProductDao productDao;
	
	private CompassTemplate compassTemplate;
	
	@Override
	public List searchProducts(String description) {
		List productList = new ArrayList();
		
		Compass compass = compassTemplate.getCompass();
		CompassSession session = compass.openSession();
		
		CompassTransaction tx = null;
		
		tx = session.beginTransaction();
		CompassHits hits = session.queryBuilder().queryString("brand:"+description).toQuery().hits();
		for (int i = 0; i < hits.length(); i++) {
			Product p = (Product)hits.data(i);
			productList.add(p);
		}
		
		tx.commit();
		
		return productList;
	}

	/* setter */
	public void setProductDao(ProductDao productDao) {
		this.productDao = productDao;
	}
	public void setCompassTemplate(CompassTemplate compassTemplate) {
		this.compassTemplate = compassTemplate;
	}

}

4、compass配置applicationContext-compass.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation=" http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"
	default-lazy-init="true">


	<bean id="annotationConfiguration"
		class="org.compass.annotations.config.CompassAnnotationsConfiguration">
	</bean>


	<bean id="compass" class="org.compass.spring.LocalCompassBean">
		<property name="resourceDirectoryLocations">
			<list>
				<value>classpath:cn/changtusoft</value>
			</list>
		</property>
		<property name="connection">
			<value>/lucene/indexes</value>
		</property>


		<property name="classMappings">
			<list>
				<value>cn.changtusoft.s2sh_compass.model.Product</value>
			</list>
		</property>
		<property name="compassConfiguration"
			ref="annotationConfiguration" />

		<property name="compassSettings">
			<props>
				<prop key="compass.transaction.factory">
					org.compass.spring.transaction.SpringSyncTransactionFactory
				</prop>
				  <prop key="compass.engine.analyzer.MMAnalyzer.CustomAnalyzer">net.paoding.analysis.analyzer.PaodingAnalyzer </prop>
			</props>
		</property>

		<property name="transactionManager" ref="transactionManager" />
	</bean>


	<bean id="hibernateGpsDevice"
		class="org.compass.gps.device.hibernate.HibernateGpsDevice">
		<property name="name">
			<value>hibernateDevice</value>
		</property>
		<property name="sessionFactory" ref="sessionFactory" />
		<property name="mirrorDataChanges">
			<value>true</value>
		</property>
	</bean>
	<!-- 同步更新索引 -->
	<bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps"
		init-method="start" destroy-method="stop">
		<property name="compass" ref="compass" />
		<property name="gpsDevices">
			<list>
				<bean
					class="org.compass.spring.device.SpringSyncTransactionGpsDeviceWrapper">
					<property name="gpsDevice" ref="hibernateGpsDevice" />
				</bean>
			</list>
		</property>
	</bean>


	<bean id="compassTemplate"
		class="org.compass.core.CompassTemplate">
		<property name="compass" ref="compass" />
	</bean>

	<!-- 定时重建索引(利用quartz)或随Spring ApplicationContext启动而重建索引 -->
	<bean id="compassIndexBuilder"
		class="cn.changtusoft.s2sh_compass.service.impl.CompassIndexBuilder"
		lazy-init="false">
		<property name="compassGps" ref="compassGps" />
		<property name="buildIndex" value="true" />
		<property name="lazyTime" value="10" />
	</bean>
	 
</beans>

5、因为本实例使用的是庖丁分词,所以添加它的配置文件到src下(paoding-dic-home.properties)

paoding.dic.home=c:/paoding/dic
paoding.dic.detector.interval=60

以上就是些关键的配置。

相关推荐