搜索引擎——全文检索Compass(一)

         全文检索是一种将文件中所有文本与检索项匹配的文字资料检索方法。在java中,开源搜索引擎技术有很多,大名鼎鼎的Lucene;后来者居上的Compass等。本篇博客主要分享Compass

      Compass依靠顶级的Lucene搜索引擎,提供强大的搜索能力,并且结合了,像 Hibernate和 Spring的流行的框架,为应用提供了从数据模型和数据源同步改变的搜索力.并且添加了事务管理和快速更新优化Compass的目标是:把java应用简单集成到搜索引擎中.编码更少,查找数据更便捷 

 

Struts+Spring+Jpa+Compass

1.需要的jar

搜索引擎——全文检索Compass(一)_第1张图片

目录截图:

搜索引擎——全文检索Compass(一)_第2张图片

2.部分主要配置文件

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">
	<!-- 创建Compass注解配置對象 -->
	<bean id="annotationConfiguration"
		class="org.compass.annotations.config.CompassAnnotationsConfiguration">
	</bean>
	<!-- 创建compass Bean创建本地搜索对象 -->
	<bean id="compass" class="org.compass.spring.LocalCompassBean">
		<!-- 解析的实体类的目录 -->
		<property name="resourceDirectoryLocations">
			<list>
				<value>classpath:com/tgb</value>
			</list>
		</property>
		<!-- 定义索引的存储位置 -->
		<property name="connection">
			<value>/lucene/indexes</value>
		</property>
		<property name="classMappings">
			<list>
				<value>com.tgb.klx.model.School</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>
				<!-- 配置高亮为红色 -->
				<prop key="compass.engine.highlighter.default.formatter.simple.pre">
					<![CDATA[ <font color="red"> <b>]]>
				</prop>
				<prop key="compass.engine.highlighter.default.formatter.simple.post">
					<![CDATA[ </b> </font>]]>
				</prop>
			</props>
		</property>
		 <property name="transactionManager" ref="txManager" /> 
	</bean>

	<!-- 关于JPA的配置 -->
	<bean id="jpaGpsDevice" class="org.compass.gps.device.jpa.JpaGpsDevice">
		<property name="name">
			<value>JpaGpsDevice</value>
		</property>
		<property name="entityManagerFactory" ref="entityManagerFactory" />
		<property name="mirrorDataChanges">
			<value>true</value>
		</property>
		<property name="injectEntityLifecycleListener" value="true" />
	</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="jpaGpsDevice" />
				</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="com.tgb.klx.service.impl.CompassIndexBuilder"
		lazy-init="false">
		<property name="compassGps" ref="compassGps" />
		<property name="buildIndex" value="true" />
		<property name="lazyTime" value="10" />
	</bean>

</beans>


同时需要配置,entityManagerFactory和事务。(配置略)

Compass操作的代码:

public class SchoolManagerImpl implements ISchoolManager {

	private ISchoolDAO schoolDAO;
	private CompassTemplate compassTemplate;
	
	public void setCompassTemplate(CompassTemplate compassTemplate) {
		this.compassTemplate = compassTemplate;
	}
	public void setSchoolDAO(ISchoolDAO schoolDAO) {
		this.schoolDAO = schoolDAO;
	}
	public School findProById(int id) {
		return schoolDAO.getProById(id);
	}
	public void insertPro(School school) {
		schoolDAO.addPro(school);
		
	}
	public List<School> searchSchools(String queryString) {
		Compass compass = compassTemplate.getCompass();
		CompassSession session = compass.openSession();
		CompassQueryBuilder queryBuilder = session.queryBuilder();   
        CompassBooleanQueryBuilder boolQuery = queryBuilder.bool();  
        boolQuery.addShould(session.queryBuilder().queryString("name"+queryString).toQuery());
		CompassHits hits = queryBuilder.queryString(queryString).toQuery().hits();
		List<School> list = new ArrayList<School>();
		for(int i = 0; i < hits.length() ; i++){
			list.add((School)hits.data(i));
		}
		return list;
	}
}


实体配置:

@Searchable
@Entity
@Table(name = "school")
public class School implements java.io.Serializable {
	@SearchableId
	@Id
	@GeneratedValue(generator="paymentableGenerator")
	@GenericGenerator(name="paymentableGenerator", strategy="assigned")
	@Column(name="id", length=64)
	private Integer id;
	@SearchableProperty(name="name")
	private String name;
	@SearchableProperty(name="examcourse")
	private String examCourse;
	@SearchableProperty(name="examtime")
	private String examTime;
	@SearchableProperty(name="description")
	private String description;


在实体上标注Searchable为可检索的实体,在属性上标注SearchableProperty为可检索的属性。

3.效果截图:

录入:

搜索引擎——全文检索Compass(一)_第3张图片
 

依次录入多个测试数据;

查询:搜索带有“学”字的信息:


查询结果如下:

搜索引擎——全文检索Compass(一)_第4张图片

4.总结

     Compass比普通的在数据库写like语句模糊查询效率高出很多倍,它是在存入数据库时同时存入索引文件一份,数据库更新时,索引文件也更新;索引文件保持与数据库同步,查询时通过索引查询,极大的提高了效率。



附:源码下载,有兴趣的朋友可以下载看看,Demo里面用到的分词器是庖丁,需要配置。

源码 密码:c3n6


你可能感兴趣的:(搜索引擎——全文检索Compass(一))