<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>liulang&#039;s blog &#187; 搜索引擎</title>
	<atom:link href="http://www.liulang.cq.cn/category/search/feed" rel="self" type="application/rss+xml" />
	<link>http://www.liulang.cq.cn</link>
	<description>既然选择了远方，便只顾风雨兼程……</description>
	<lastBuildDate>Thu, 10 Jun 2010 11:41:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Compass文档笔记</title>
		<link>http://www.liulang.cq.cn/20090731/compassconfig.html</link>
		<comments>http://www.liulang.cq.cn/20090731/compassconfig.html#comments</comments>
		<pubDate>Fri, 31 Jul 2009 09:41:43 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[搜索引擎]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=40</guid>
		<description><![CDATA[Compass是基于Lucene 的更高层的抽象，假如你正打算做关于搜索方面的模块的话，那我建议你使用Compass，他提供了可配置方案，而且比Lucene更加容易使用。如果你的系统中使用Spring， Hibernate，JDO， IBatis。。。 Compass是最好的选择，他能够非常方便的集成到现有系统中去。

1.   Compass的framework的系统结构。
感觉Compass的代码的结构简直就是剽窃Hibernate的，可能Compass的最初目的是用来整合Hibernate的，
CompassConfiguration conf =
new CompassConfiguration().configure().addClass(Author.class);
Compass compass = conf.buildCompass();
CompassSession session = compass.openSession();
CompassTransaction tx = null;
try {
tx = session.beginTransaction();
&#8230;
session.save(author);
CompassHits hits = session.find(&#8220;jack london&#8221;);
Author a = (Author) hits.data(0);
Resource r = hits.getResource(0);
&#8230;
tx.commit();
} catch (CompassException ce) {
if (tx != null) tx.rollback();
} finally {
session.close();
}
假如你对Hibernate有了解的话，相信你对Compass会比较容易理解的，你可以把Hibernate的思想转移到Compass上。现在让我们看看他们之间的相似吧。
compass.cfg.xml
&#60;compass-core-config xmlns=&#8221;http://www.opensymphony.com/compass/schema/core-config&#8221;
xmlns:xsi=&#8221;http://www.w3.org/2001/XMLSchema-instance&#8221;
xsi:schemaLocation=&#8221;http://www.opensymphony.com/compass/schema/core-config
http://www.opensymphony.com/compass/schema/compass-core-config.xsd&#8221;&#62;
&#60;compass name=&#8221;default&#8221;&#62;
&#60;connection&#62;
&#60;file path=&#8221;target/test-index&#8221;/&#62;
&#60;/connection&#62;
&#60;mappings&#62;
&#60;class name=&#8221;test.Author&#8221; /&#62;
&#60;/mappings&#62;
&#60;/compass&#62;
&#60;/compass-core-config&#62;
这个是Compass总的配置文件，其中定义了索引文件存储的位置（这里是用文件系统，Compass有多种选择，你也可以选数据库或其他），Compass索引的对象是面向PoJo的，这里的是Author，对应的文件是test/Author.cpm.xml.
当然这里面的配置属性不止这么多，更多的属性见Configure属性。
CompassConfiguration conf = new CompassConfiguration()
.setSetting(CompassEnvironment.CONNECTION, &#8221;my/index/dir&#8221;)
.addResource(DublinCore.cmd.xml).addClass(Author.class);
Compass compass = conf.buildCompass();
这里我们CompassConfiguration会读取默认的在classpath中的compass.cfg.xml初始化，然后得到Compass对象，可能你会马上意思到这个Compass肯定对应于Hibenate中的SessionFactory，是的，这是一个重量级的对象，
我们需要通过这个对象得到CompassSession，然后进行CRUD操作，CompassSession跟Hibernate中的Session一样是个lightweight对象。关于对Search domain的配置(Author.cpm.xml),大家可以查看cpm文件配置。在那里面
主要是定义了那些properties是需要被索引的。
&#60;?xml version=&#8221;1.0&#8243;?&#62;
&#60;compass-core-mapping package=&#8221;eg&#8221;&#62;
&#60;class name=&#8221;Author&#8221; alias=&#8221;author&#8221;&#62;
&#60;id name=&#8221;id&#8221; /&#62;
&#60;constant&#62;
&#60;meta-data&#62;type&#60;/meta-data&#62;
&#60;meta-data-value&#62;person&#60;/meta-data-value&#62;
&#60;meta-data-value&#62;author&#60;/meta-data-value&#62;
&#60;/constant&#62;
&#60;property name=&#8221;name&#8221;&#62;
&#60;meta-data&#62;name&#60;/meta-data&#62;
&#60;meta-data&#62;authorName&#60;/meta-data&#62;
&#60;/property&#62;
&#60;property name=&#8221;birthday&#8221;&#62;
&#60;meta-data&#62;birthday&#60;/meta-data&#62;
&#60;/property&#62;
&#60;component name=&#8221;books&#8221; ref-alias=&#8221;book&#8221; /&#62;
&#60;!&#8211; can be a reference instead of component
&#60;reference name=&#8221;books&#8221; ref-alias=&#8221;book&#8221; /&#62;
&#8211;&#62;
&#60;/class&#62;
&#60;class name=&#8221;Book&#8221; alias=&#8221;book&#8221;&#62;
&#8230;
&#60;/class&#62;
&#60;/compass-core-mapping&#62;
2.  索引文件结构
&#8212;[index dir]/index
&#124;
&#124;&#8211; [subIndex1]
&#124;      &#124;
&#124;      &#124;&#8212; segments
&#124;      &#124;&#8212; [segment1]
&#124;      &#124;&#8212; [segment2]
&#124;
&#124;&#8211; [subIndex2]
&#124;      &#124;
&#124;      &#124;&#8212; segments
&#124;      &#124;&#8212; [segment1]
&#124;      &#124;&#8212; [segment2]
&#124;      &#124;&#8212; [segment3]
&#124;
&#8230;
基本上是一个search domain放到一个subIndex文件夹中，更确切的说是相同alias name的search domain放到相同的sub index folder中。
3.  Compass中的操作
通过CompassSession我们可以进行save，delete， get，load。假如我们有两个domain Object，Author 和 Book，假如我们想要query Book的话要怎样做呢？ 我们需要使用alias（这个属性定义在cmp文件中），
通过CompassQueryBuilder去构造CompassQuery, CompassQueryBuilder非常灵活，非常像Hibernate的Criteria查询。具体的sample请看 Working with objects
CompassHits hits = session.createQueryBuilder()
.queryString(&#8220;+name:jack +familyName:london&#8221;)
.setAnalyzer(&#8220;an1&#8243;) // use a different analyzer
.toQuery()
.addSort(&#8220;familyName&#8221;, CompassQuery.SortPropertyType.STRING)
.addSort(&#8220;birthdate&#8221;, CompassQuery.SortPropertyType.INT)
.hits();
4.  CompassGps and CompassGpsDevice
CompassGps像是一个Service，他需要在application startup时启动服务， application shutdown停止服务，CompassGpsDevice不能独立的存在，他需要依赖CompassGps， CompassGps为CompassGpsDevice提供
Compass对象，他们一起为程序提供Index的实时更新。 Compass整合Hibernate 等等 persitance framework的代码就在CompassGpsDevice里，你需要提供不同的Device，如HibernateDevice， JDODevice。你也
可以实现自己的Device， CompassGpsDevice会把domain object的更新事件通过CompassGps去通知Compass去更新索引文件，这样就是可以实时更新index了。有兴趣的话可以看看Hibernate3GpsDevice的
registerEventsForHibernate31（）方法，他给Hibernate的save，delete，update操作增加listener。当然我们可以使用aop自己去实现这块。CompassGps and CompassGpsDevice
Compass compass = &#8230; // configure compass
CompassGps gps = new SingleCompassGps(compass);
CompassGpsDevice device1 = &#8230; // configure the first device
device1.setName(&#8220;device1&#8243;);
gps.addDevice(device1);
CompassGpsDevice device2 = &#8230; // configure the second device
device2.setName(&#8220;device2&#8243;);
gps.addDevice(device2);
gps.start();
&#8230;.
&#8230;.
//on application shutdown
gps.stop();
5.  整合Spring，Hibenate
在Compass的lib里面就有非常好的一个sample了（petclinic），里面有对Spring，Hibenate的整合，其实对spring来说也就是通过ioc把CompassGps 和 Compass定义好。CompassGps主要负责re－index和index实时更新
， Compass主要提供了自定义Search部分的入口（CompassTemplate）。Spring提供了对Compass的DAO的整合，在CompassDaoSupport 中拿到CompassTemplate，这个跟spring对hibernatedao的支持是一致的。
public class LibraryCompassDao extends CompassDaoSupport {
public int getNumberOfHits(final String query) {
Integer numberOfHits = (Integer)getCompassTemplate().execute(
new CompassCallback() {
public Object doInCompass(CompassSession session) {
CompassHits hits = session.find(query);
return new Integer(hits.getLength());
}
}
);
}
return numberOfHits.intValue();
}
&#60;beans&#62;
&#60;bean id=&#8221;libraryCompass&#8221; class=&#8221;LibraryCompassDao&#8221;&#62;
&#60;property name=&#8221;compass&#8221;&#62;
&#60;ref local=&#8221;compass&#8221; /&#62;
&#60;/property&#62;
&#60;/bean&#62;
&#60;/beans&#62;
&#60;!&#8211; COMPASS START &#8211;&#62;
&#60;bean id=&#8221;compass&#8221; class=&#8221;org.compass.spring.LocalCompassBean&#8221;&#62;
&#60;property name=&#8221;resourceLocations&#8221;&#62;
&#60;list&#62;
&#60;value&#62;classpath:org/compass/sample/petclinic/petclinic.cmd.xml&#60;/value&#62;
&#60;value&#62;classpath:petclinic.cpm.xml&#60;/value&#62;
&#60;/list&#62;
&#60;/property&#62;
&#60;property name=&#8221;compassSettings&#8221;&#62;
&#60;props&#62;
&#60;prop key=&#8221;compass.engine.connection&#8221;&#62;file://${user.home}/compass/petclinic&#60;/prop&#62;
&#60;prop key=&#8221;compass.transaction.factory&#8221;&#62;org.compass.spring.transaction.SpringSyncTransactionFactory&#60;/prop&#62;
&#60;/props&#62;
&#60;/property&#62;
&#60;property name=&#8221;transactionManager&#8221;&#62;
&#60;ref local=&#8221;transactionManager&#8221; /&#62;
&#60;/property&#62;
&#60;/bean&#62;
&#60;bean id=&#8221;hibernateGpsDevice&#8221; class=&#8221;org.compass.spring.device.hibernate.SpringHibernate3GpsDevice&#8221;&#62;
&#60;property name=&#8221;name&#8221;&#62;&#60;value&#62;hibernateDevice&#60;/value&#62;&#60;/property&#62;
&#60;property name=&#8221;sessionFactory&#8221;&#62;&#60;ref local=&#8221;sessionFactory&#8221; /&#62;&#60;/property&#62;
&#60;/bean&#62;
&#60;bean id=&#8221;compassGps&#8221; class=&#8221;org.compass.gps.impl.SingleCompassGps&#8221; init-method=&#8221;start&#8221; destroy-method=&#8221;stop&#8221;&#62;
&#60;property name=&#8221;compass&#8221;&#62;&#60;ref bean=&#8221;compass&#8221; /&#62;&#60;/property&#62;
&#60;property name=&#8221;gpsDevices&#8221;&#62;
&#60;list&#62;
&#60;ref local=&#8221;hibernateGpsDevice&#8221; /&#62;
&#60;/list&#62;
&#60;/property&#62;
&#60;/bean&#62;
&#60;!&#8211; COMPASS END &#8211;&#62;
&#60;!&#8211; Transaction manager for a single Hibernate SessionFactory (alternative to JTA) &#8211;&#62;
&#60;bean id=&#8221;transactionManager&#8221; class=&#8221;org.springframework.orm.hibernate3.HibernateTransactionManager&#8221;&#62;
&#60;property name=&#8221;sessionFactory&#8221;&#62;&#60;ref local=&#8221;sessionFactory&#8221;/&#62;&#60;/property&#62;
&#60;/bean&#62;
&#60;!&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-一下是对anototion的配置。&#8211;&#62;
&#60;bean id=&#8221;annotationConfiguration&#8221;
class=&#8221;org.compass.annotations.config.CompassAnnotationsConfiguration&#8221;&#62;
&#60;/bean&#62;
&#60;!&#8211; 核心Compass Bean,search及index时使用 &#8211;&#62;
&#60;bean id=&#8221;compass&#8221; class=&#8221;org.compass.spring.LocalCompassBean&#8221;&#62;
&#60;!&#8211; anontaition式设置         &#8211;&#62;
&#60;property name=&#8221;classMappings&#8221;&#62;
&#60;list&#62;
&#60;value&#62;com.dengyin.compass.sample.domain.Book&#60;/value&#62;
&#60;/list&#62;
&#60;/property&#62;
&#60;property name=&#8221;compassConfiguration&#8221; ref=&#8221;annotationConfiguration&#8221;/&#62;
&#60;!&#8211; xml 文件式设置
&#60;property name=&#8221;resourceLocations&#8221;&#62;
&#60;list&#62;
&#60;value&#62;classpath:compass-springside.cmd.xml&#60;/value&#62;
&#60;value&#62;classpath:compass-springside.cpm.xml&#60;/value&#62;
&#60;/list&#62;
&#60;/property&#62;
&#8211;&#62;
&#60;property name=&#8221;compassSettings&#8221;&#62;
&#60;props&#62;
&#60;prop key=&#8221;compass.engine.connection&#8221;&#62;
file://${user.home}/springside/compass
&#60;/prop&#62;
&#60;prop key=&#8221;compass.transaction.factory&#8221;&#62;
org.compass.spring.transaction.SpringSyncTransactionFactory
&#60;/prop&#62;
&#60;/props&#62;
&#60;/property&#62;
&#60;property name=&#8221;transactionManager&#8221; ref=&#8221;transactionManager&#8221;/&#62;
&#60;/bean&#62;
&#60;!&#8211;Compass的GPS绑定,在index时使用&#8211;&#62;
&#60;bean id=&#8221;compassGps&#8221; class=&#8221;org.compass.gps.impl.SingleCompassGps&#8221;
init-method=&#8221;start&#8221; destroy-method=&#8221;stop&#8221;&#62;
&#60;property name=&#8221;compass&#8221; ref=&#8221;compass&#8221;/&#62;
&#60;property name=&#8221;gpsDevices&#8221;&#62;
&#60;list&#62;
&#60;bean class=&#8221;org.compass.spring.device.hibernate.SpringHibernate3GpsDevice&#8221;&#62;
&#60;property name=&#8221;name&#8221;&#62;
&#60;value&#62;hibernateDevice&#60;/value&#62;
&#60;/property&#62;
&#60;property name=&#8221;sessionFactory&#8221; ref=&#8221;sessionFactory&#8221;/&#62;
&#60;/bean&#62;
&#60;/list&#62;
&#60;/property&#62;
&#60;/bean&#62;
ok! 相信你对Compass有一定的了解了
]]></description>
			<content:encoded><![CDATA[<p>Compass是基于Lucene 的更高层的抽象，假如你正打算做关于搜索方面的模块的话，那我建议你使用Compass，他提供了可配置方案，而且比Lucene更加容易使用。如果你的系统中使用Spring， Hibernate，JDO， IBatis。。。 Compass是最好的选择，他能够非常方便的集成到现有系统中去。</p>
<p><span id="more-40"></span></p>
<p>1.   Compass的framework的系统结构。</p>
<p>感觉Compass的代码的结构简直就是剽窃Hibernate的，可能Compass的最初目的是用来整合Hibernate的，</p>
<p>CompassConfiguration conf =</p>
<p>new CompassConfiguration().configure().addClass(Author.class);</p>
<p>Compass compass = conf.buildCompass();</p>
<p>CompassSession session = compass.openSession();</p>
<p>CompassTransaction tx = null;</p>
<p>try {</p>
<p>tx = session.beginTransaction();</p>
<p>&#8230;</p>
<p>session.save(author);</p>
<p>CompassHits hits = session.find(&#8220;jack london&#8221;);</p>
<p>Author a = (Author) hits.data(0);</p>
<p>Resource r = hits.getResource(0);</p>
<p>&#8230;</p>
<p>tx.commit();</p>
<p>} catch (CompassException ce) {</p>
<p>if (tx != null) tx.rollback();</p>
<p>} finally {</p>
<p>session.close();</p>
<p>}</p>
<p>假如你对Hibernate有了解的话，相信你对Compass会比较容易理解的，你可以把Hibernate的思想转移到Compass上。现在让我们看看他们之间的相似吧。</p>
<p>compass.cfg.xml</p>
<p>&lt;compass-core-config xmlns=&#8221;http://www.opensymphony.com/compass/schema/core-config&#8221;</p>
<p>xmlns:xsi=&#8221;http://www.w3.org/2001/XMLSchema-instance&#8221;</p>
<p>xsi:schemaLocation=&#8221;http://www.opensymphony.com/compass/schema/core-config</p>
<p>http://www.opensymphony.com/compass/schema/compass-core-config.xsd&#8221;&gt;</p>
<p>&lt;compass name=&#8221;default&#8221;&gt;</p>
<p>&lt;connection&gt;</p>
<p>&lt;file path=&#8221;target/test-index&#8221;/&gt;</p>
<p>&lt;/connection&gt;</p>
<p>&lt;mappings&gt;</p>
<p>&lt;class name=&#8221;test.Author&#8221; /&gt;</p>
<p>&lt;/mappings&gt;</p>
<p>&lt;/compass&gt;</p>
<p>&lt;/compass-core-config&gt;</p>
<p>这个是Compass总的配置文件，其中定义了索引文件存储的位置（这里是用文件系统，Compass有多种选择，你也可以选数据库或其他），Compass索引的对象是面向PoJo的，这里的是Author，对应的文件是test/Author.cpm.xml.</p>
<p>当然这里面的配置属性不止这么多，更多的属性见Configure属性。</p>
<p>CompassConfiguration conf = new CompassConfiguration()</p>
<p>.setSetting(CompassEnvironment.CONNECTION, &#8221;my/index/dir&#8221;)</p>
<p>.addResource(DublinCore.cmd.xml).addClass(Author.class);</p>
<p>Compass compass = conf.buildCompass();</p>
<p>这里我们CompassConfiguration会读取默认的在classpath中的compass.cfg.xml初始化，然后得到Compass对象，可能你会马上意思到这个Compass肯定对应于Hibenate中的SessionFactory，是的，这是一个重量级的对象，</p>
<p>我们需要通过这个对象得到CompassSession，然后进行CRUD操作，CompassSession跟Hibernate中的Session一样是个lightweight对象。关于对Search domain的配置(Author.cpm.xml),大家可以查看cpm文件配置。在那里面</p>
<p>主要是定义了那些properties是需要被索引的。</p>
<p>&lt;?xml version=&#8221;1.0&#8243;?&gt;</p>
<p>&lt;compass-core-mapping package=&#8221;eg&#8221;&gt;</p>
<p>&lt;class name=&#8221;Author&#8221; alias=&#8221;author&#8221;&gt;</p>
<p>&lt;id name=&#8221;id&#8221; /&gt;</p>
<p>&lt;constant&gt;</p>
<p>&lt;meta-data&gt;type&lt;/meta-data&gt;</p>
<p>&lt;meta-data-value&gt;person&lt;/meta-data-value&gt;</p>
<p>&lt;meta-data-value&gt;author&lt;/meta-data-value&gt;</p>
<p>&lt;/constant&gt;</p>
<p>&lt;property name=&#8221;name&#8221;&gt;</p>
<p>&lt;meta-data&gt;name&lt;/meta-data&gt;</p>
<p>&lt;meta-data&gt;authorName&lt;/meta-data&gt;</p>
<p>&lt;/property&gt;</p>
<p>&lt;property name=&#8221;birthday&#8221;&gt;</p>
<p>&lt;meta-data&gt;birthday&lt;/meta-data&gt;</p>
<p>&lt;/property&gt;</p>
<p>&lt;component name=&#8221;books&#8221; ref-alias=&#8221;book&#8221; /&gt;</p>
<p>&lt;!&#8211; can be a reference instead of component</p>
<p>&lt;reference name=&#8221;books&#8221; ref-alias=&#8221;book&#8221; /&gt;</p>
<p>&#8211;&gt;</p>
<p>&lt;/class&gt;</p>
<p>&lt;class name=&#8221;Book&#8221; alias=&#8221;book&#8221;&gt;</p>
<p>&#8230;</p>
<p>&lt;/class&gt;</p>
<p>&lt;/compass-core-mapping&gt;</p>
<p>2.  索引文件结构</p>
<p>&#8212;[index dir]/index</p>
<p>|</p>
<p>|&#8211; [subIndex1]</p>
<p>|      |</p>
<p>|      |&#8212; segments</p>
<p>|      |&#8212; [segment1]</p>
<p>|      |&#8212; [segment2]</p>
<p>|</p>
<p>|&#8211; [subIndex2]</p>
<p>|      |</p>
<p>|      |&#8212; segments</p>
<p>|      |&#8212; [segment1]</p>
<p>|      |&#8212; [segment2]</p>
<p>|      |&#8212; [segment3]</p>
<p>|</p>
<p>&#8230;</p>
<p>基本上是一个search domain放到一个subIndex文件夹中，更确切的说是相同alias name的search domain放到相同的sub index folder中。</p>
<p>3.  Compass中的操作</p>
<p>通过CompassSession我们可以进行save，delete， get，load。假如我们有两个domain Object，Author 和 Book，假如我们想要query Book的话要怎样做呢？ 我们需要使用alias（这个属性定义在cmp文件中），</p>
<p>通过CompassQueryBuilder去构造CompassQuery, CompassQueryBuilder非常灵活，非常像Hibernate的Criteria查询。具体的sample请看 Working with objects</p>
<p>CompassHits hits = session.createQueryBuilder()</p>
<p>.queryString(&#8220;+name:jack +familyName:london&#8221;)</p>
<p>.setAnalyzer(&#8220;an1&#8243;) // use a different analyzer</p>
<p>.toQuery()</p>
<p>.addSort(&#8220;familyName&#8221;, CompassQuery.SortPropertyType.STRING)</p>
<p>.addSort(&#8220;birthdate&#8221;, CompassQuery.SortPropertyType.INT)</p>
<p>.hits();</p>
<p>4.  CompassGps and CompassGpsDevice</p>
<p>CompassGps像是一个Service，他需要在application startup时启动服务， application shutdown停止服务，CompassGpsDevice不能独立的存在，他需要依赖CompassGps， CompassGps为CompassGpsDevice提供</p>
<p>Compass对象，他们一起为程序提供Index的实时更新。 Compass整合Hibernate 等等 persitance framework的代码就在CompassGpsDevice里，你需要提供不同的Device，如HibernateDevice， JDODevice。你也</p>
<p>可以实现自己的Device， CompassGpsDevice会把domain object的更新事件通过CompassGps去通知Compass去更新索引文件，这样就是可以实时更新index了。有兴趣的话可以看看Hibernate3GpsDevice的</p>
<p>registerEventsForHibernate31（）方法，他给Hibernate的save，delete，update操作增加listener。当然我们可以使用aop自己去实现这块。CompassGps and CompassGpsDevice</p>
<p>Compass compass = &#8230; // configure compass</p>
<p>CompassGps gps = new SingleCompassGps(compass);</p>
<p>CompassGpsDevice device1 = &#8230; // configure the first device</p>
<p>device1.setName(&#8220;device1&#8243;);</p>
<p>gps.addDevice(device1);</p>
<p>CompassGpsDevice device2 = &#8230; // configure the second device</p>
<p>device2.setName(&#8220;device2&#8243;);</p>
<p>gps.addDevice(device2);</p>
<p>gps.start();</p>
<p>&#8230;.</p>
<p>&#8230;.</p>
<p>//on application shutdown</p>
<p>gps.stop();</p>
<p>5.  整合Spring，Hibenate</p>
<p>在Compass的lib里面就有非常好的一个sample了（petclinic），里面有对Spring，Hibenate的整合，其实对spring来说也就是通过ioc把CompassGps 和 Compass定义好。CompassGps主要负责re－index和index实时更新</p>
<p>， Compass主要提供了自定义Search部分的入口（CompassTemplate）。Spring提供了对Compass的DAO的整合，在CompassDaoSupport 中拿到CompassTemplate，这个跟spring对hibernatedao的支持是一致的。</p>
<p>public class LibraryCompassDao extends CompassDaoSupport {</p>
<p>public int getNumberOfHits(final String query) {</p>
<p>Integer numberOfHits = (Integer)getCompassTemplate().execute(</p>
<p>new CompassCallback() {</p>
<p>public Object doInCompass(CompassSession session) {</p>
<p>CompassHits hits = session.find(query);</p>
<p>return new Integer(hits.getLength());</p>
<p>}</p>
<p>}</p>
<p>);</p>
<p>}</p>
<p>return numberOfHits.intValue();</p>
<p>}</p>
<p>&lt;beans&gt;</p>
<p>&lt;bean id=&#8221;libraryCompass&#8221; class=&#8221;LibraryCompassDao&#8221;&gt;</p>
<p>&lt;property name=&#8221;compass&#8221;&gt;</p>
<p>&lt;ref local=&#8221;compass&#8221; /&gt;</p>
<p>&lt;/property&gt;</p>
<p>&lt;/bean&gt;</p>
<p>&lt;/beans&gt;</p>
<p>&lt;!&#8211; COMPASS START &#8211;&gt;</p>
<p>&lt;bean id=&#8221;compass&#8221; class=&#8221;org.compass.spring.LocalCompassBean&#8221;&gt;</p>
<p>&lt;property name=&#8221;resourceLocations&#8221;&gt;</p>
<p>&lt;list&gt;</p>
<p>&lt;value&gt;classpath:org/compass/sample/petclinic/petclinic.cmd.xml&lt;/value&gt;</p>
<p>&lt;value&gt;classpath:petclinic.cpm.xml&lt;/value&gt;</p>
<p>&lt;/list&gt;</p>
<p>&lt;/property&gt;</p>
<p>&lt;property name=&#8221;compassSettings&#8221;&gt;</p>
<p>&lt;props&gt;</p>
<p>&lt;prop key=&#8221;compass.engine.connection&#8221;&gt;file://${user.home}/compass/petclinic&lt;/prop&gt;</p>
<p>&lt;prop key=&#8221;compass.transaction.factory&#8221;&gt;org.compass.spring.transaction.SpringSyncTransactionFactory&lt;/prop&gt;</p>
<p>&lt;/props&gt;</p>
<p>&lt;/property&gt;</p>
<p>&lt;property name=&#8221;transactionManager&#8221;&gt;</p>
<p>&lt;ref local=&#8221;transactionManager&#8221; /&gt;</p>
<p>&lt;/property&gt;</p>
<p>&lt;/bean&gt;</p>
<p>&lt;bean id=&#8221;hibernateGpsDevice&#8221; class=&#8221;org.compass.spring.device.hibernate.SpringHibernate3GpsDevice&#8221;&gt;</p>
<p>&lt;property name=&#8221;name&#8221;&gt;&lt;value&gt;hibernateDevice&lt;/value&gt;&lt;/property&gt;</p>
<p>&lt;property name=&#8221;sessionFactory&#8221;&gt;&lt;ref local=&#8221;sessionFactory&#8221; /&gt;&lt;/property&gt;</p>
<p>&lt;/bean&gt;</p>
<p>&lt;bean id=&#8221;compassGps&#8221; class=&#8221;org.compass.gps.impl.SingleCompassGps&#8221; init-method=&#8221;start&#8221; destroy-method=&#8221;stop&#8221;&gt;</p>
<p>&lt;property name=&#8221;compass&#8221;&gt;&lt;ref bean=&#8221;compass&#8221; /&gt;&lt;/property&gt;</p>
<p>&lt;property name=&#8221;gpsDevices&#8221;&gt;</p>
<p>&lt;list&gt;</p>
<p>&lt;ref local=&#8221;hibernateGpsDevice&#8221; /&gt;</p>
<p>&lt;/list&gt;</p>
<p>&lt;/property&gt;</p>
<p>&lt;/bean&gt;</p>
<p>&lt;!&#8211; COMPASS END &#8211;&gt;</p>
<p>&lt;!&#8211; Transaction manager for a single Hibernate SessionFactory (alternative to JTA) &#8211;&gt;</p>
<p>&lt;bean id=&#8221;transactionManager&#8221; class=&#8221;org.springframework.orm.hibernate3.HibernateTransactionManager&#8221;&gt;</p>
<p>&lt;property name=&#8221;sessionFactory&#8221;&gt;&lt;ref local=&#8221;sessionFactory&#8221;/&gt;&lt;/property&gt;</p>
<p>&lt;/bean&gt;</p>
<p>&lt;!&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-一下是对anototion的配置。&#8211;&gt;</p>
<p>&lt;bean id=&#8221;annotationConfiguration&#8221;</p>
<p>class=&#8221;org.compass.annotations.config.CompassAnnotationsConfiguration&#8221;&gt;</p>
<p>&lt;/bean&gt;</p>
<p>&lt;!&#8211; 核心Compass Bean,search及index时使用 &#8211;&gt;</p>
<p>&lt;bean id=&#8221;compass&#8221; class=&#8221;org.compass.spring.LocalCompassBean&#8221;&gt;</p>
<p>&lt;!&#8211; anontaition式设置         &#8211;&gt;</p>
<p>&lt;property name=&#8221;classMappings&#8221;&gt;</p>
<p>&lt;list&gt;</p>
<p>&lt;value&gt;com.dengyin.compass.sample.domain.Book&lt;/value&gt;</p>
<p>&lt;/list&gt;</p>
<p>&lt;/property&gt;</p>
<p>&lt;property name=&#8221;compassConfiguration&#8221; ref=&#8221;annotationConfiguration&#8221;/&gt;</p>
<p>&lt;!&#8211; xml 文件式设置</p>
<p>&lt;property name=&#8221;resourceLocations&#8221;&gt;</p>
<p>&lt;list&gt;</p>
<p>&lt;value&gt;classpath:compass-springside.cmd.xml&lt;/value&gt;</p>
<p>&lt;value&gt;classpath:compass-springside.cpm.xml&lt;/value&gt;</p>
<p>&lt;/list&gt;</p>
<p>&lt;/property&gt;</p>
<p>&#8211;&gt;</p>
<p>&lt;property name=&#8221;compassSettings&#8221;&gt;</p>
<p>&lt;props&gt;</p>
<p>&lt;prop key=&#8221;compass.engine.connection&#8221;&gt;</p>
<p>file://${user.home}/springside/compass</p>
<p>&lt;/prop&gt;</p>
<p>&lt;prop key=&#8221;compass.transaction.factory&#8221;&gt;</p>
<p>org.compass.spring.transaction.SpringSyncTransactionFactory</p>
<p>&lt;/prop&gt;</p>
<p>&lt;/props&gt;</p>
<p>&lt;/property&gt;</p>
<p>&lt;property name=&#8221;transactionManager&#8221; ref=&#8221;transactionManager&#8221;/&gt;</p>
<p>&lt;/bean&gt;</p>
<p>&lt;!&#8211;Compass的GPS绑定,在index时使用&#8211;&gt;</p>
<p>&lt;bean id=&#8221;compassGps&#8221; class=&#8221;org.compass.gps.impl.SingleCompassGps&#8221;</p>
<p>init-method=&#8221;start&#8221; destroy-method=&#8221;stop&#8221;&gt;</p>
<p>&lt;property name=&#8221;compass&#8221; ref=&#8221;compass&#8221;/&gt;</p>
<p>&lt;property name=&#8221;gpsDevices&#8221;&gt;</p>
<p>&lt;list&gt;</p>
<p>&lt;bean class=&#8221;org.compass.spring.device.hibernate.SpringHibernate3GpsDevice&#8221;&gt;</p>
<p>&lt;property name=&#8221;name&#8221;&gt;</p>
<p>&lt;value&gt;hibernateDevice&lt;/value&gt;</p>
<p>&lt;/property&gt;</p>
<p>&lt;property name=&#8221;sessionFactory&#8221; ref=&#8221;sessionFactory&#8221;/&gt;</p>
<p>&lt;/bean&gt;</p>
<p>&lt;/list&gt;</p>
<p>&lt;/property&gt;</p>
<p>&lt;/bean&gt;</p>
<p>ok! 相信你对Compass有一定的了解了</p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20090731/compassconfig.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nutch1.0配置笔记</title>
		<link>http://www.liulang.cq.cn/20090714/nutch1-0config.html</link>
		<comments>http://www.liulang.cq.cn/20090714/nutch1-0config.html#comments</comments>
		<pubDate>Tue, 14 Jul 2009 15:33:24 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[搜索引擎]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=12</guid>
		<description><![CDATA[配置软件：
1、 Java jdk-1.6
1.1 下载安装
from: http://www.sun.com
安装目录：C:\Java\jdk1.6.0_03
1.2 修改环境变量
JAVA_HOME=C:\Java\jdk1.6.0_03\bin
CLASSPATH＝C:\Java\jdk1.6.0_03\lib\dt.jar；C:\Java\jdk1.6.0_03\lib\tools.jar
1.3 测试
java -version

2、tomcat-6.0
2.1 下载
from: http://tomcat.apache.org/
2.2 解压到C盘目录并改名
安装目录：C:\tomcat6
2.3 修改配置
conf/server.xml
QUOTE:
  &#60;!&#8211; Define a non-SSL HTTP/1.1 Connector on port 8080 &#8211;&#62;
    &#60;Connector port=&#8221;8080&#8243; maxHttpHeaderSize=&#8221;8192&#8243;
            maxThreads=&#8221;150&#8243; minSpareThreads=&#8221;25&#8243; maxSpareThreads=&#8221;75&#8243;
               enableLookups=&#8221;false&#8221; redirectPort=&#8221;8443&#8243; acceptCount=&#8221;100&#8243;
               c disableUploadTimeout=&#8221;true&#8221;
               URIEncoding=&#8221;UTF-8&#8243; useBodyEncodingForURI=&#8221;true&#8221; /&#62;   
 
默认服务端口为8080，若有冲突（如Apache），则可通过此配置文件更改端口(蓝色)如果配置后nutch出现中文乱码问题，则增加编码配置(红色)
2.4 启动服务
startup
测试：http://localhost:8080/
3、安装Cygwin
from:http://www.cygwin.cn/
由于运行Nutch自带的脚本命令需要Linux的环境，所以必须首先安装Cygwin来模拟这种环境
4、 nutch-1.0
4.1 下载 http://www.apache.org/dyn/closer.cgi/lucene/nutch/
4.2  解压后到C盘根目录
C:\nutch-1.0
建 url.txt文件，指定爬取列表
在文件中写入如下内容：
例如：http://cqllang.javaeye.com/blog
4.3  指定爬虫规则
修改 conf/crawl-urlfilter.txt
 
QUOTE:
# accept hosts in MY.DOMAIN.NAME
#+^http://([a-z0-9]*\.)*MY.DOMAIN.NAME/
把这里改成你要的域名
如 +^http://cqllang.javaeye.com/blog
 
4.4 修改 conf/nutch-site.xml
QUOTE:
&#60;configuration&#62;
        &#60;property&#62;
                &#60;name&#62;http.agent.name&#60;/name&#62;
                &#60;value&#62;my nutch agent&#60;/value&#62;
        &#60;/property&#62;
        &#60;property&#62;
                &#60;name&#62;http.agent.version&#60;/name&#62;
                &#60;value&#62;1.0&#60;/value&#62;
        &#60;/property&#62;
&#60;/configuration&#62;
如果没有配置此agent，爬取时会出现 Agent name not configured! 的错误。
4.5 开始爬取
打开Cygwin,
在命令行窗口中输入：  
 　　cd /cygdrive/c/nutch-1.0
执行命令：
bin/nutch crawl url.txt -dir crawled -depth 3 -threads 4 &#62;&#38; crawl.log
在这里
dir指定抓取内容所存放的目录，depth表示以要抓取网站顶级网址为起点的爬行深度，threads指定并发的线程数。
4.6 部署web前端
将 nutch-1.0.war 拷贝到webapps目录下
通过浏览器访问http://localhost:8080/nutch-1.0/ 后，war包自解压。
4.7 修改nutch的web配置
c:\tomcat6\webapps\nutch-1.0\WEB-INF\classes\nutch-site.xml
将内容更改为索引生成的目录。
QUOTE:
&#60;nutch-conf&#62;
        &#60;property&#62;
                &#60;name&#62;searcher.dir&#60;/name&#62;
                &#60;value&#62;c:/nutch-1.0/crawled&#60;/value&#62;
        &#60;/property&#62;
&#60;/nutch-conf&#62;
]]></description>
			<content:encoded><![CDATA[<p>配置软件：<br />
1、 Java jdk-1.6</p>
<p>1.1 下载安装</p>
<p>from: <a href="http://www.sun.com/">http://www.sun.com</a></p>
<p>安装目录：C:\Java\jdk1.6.0_03<br />
1.2 修改环境变量<br />
JAVA_HOME=C:\Java\jdk1.6.0_03\bin</p>
<p>CLASSPATH＝C:\Java\jdk1.6.0_03\lib\dt.jar；C:\Java\jdk1.6.0_03\lib\tools.jar<br />
1.3 测试<br />
java -version</p>
<p><img title="更多..." src="http://www.liulang.cq.cn/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" /><span id="more-12"></span></p>
<p>2、tomcat-6.0</p>
<p>2.1 下载<br />
from: <a href="http://tomcat.apache.org/">http://tomcat.apache.org/</a></p>
<p>2.2 解压到C盘目录并改名</p>
<p>安装目录：C:\tomcat6</p>
<p>2.3 修改配置<br />
conf/server.xml</p>
<p>QUOTE:</p>
<p>  &lt;!&#8211; Define a non-SSL HTTP/1.1 Connector on port 8080 &#8211;&gt;<br />
    &lt;Connector port=&#8221;8080&#8243; maxHttpHeaderSize=&#8221;8192&#8243;<br />
            maxThreads=&#8221;150&#8243; minSpareThreads=&#8221;25&#8243; maxSpareThreads=&#8221;75&#8243;<br />
               enableLookups=&#8221;false&#8221; redirectPort=&#8221;8443&#8243; acceptCount=&#8221;100&#8243;<br />
               c disableUploadTimeout=&#8221;true&#8221;<br />
               <span style="color: #ff0000;">URIEncoding=&#8221;UTF-8&#8243; useBodyEncodingForURI=&#8221;true&#8221;</span> /&gt;   </p>
<p> </p>
<p>默认服务端口为8080，若有冲突（如Apache），则可通过此配置文件更改端口(蓝色)如果配置后nutch出现中文乱码问题，则增加编码配置(红色)</p>
<p>2.4 启动服务<br />
startup</p>
<p>测试：<a href="http://localhost:8080/">http://localhost:8080/</a></p>
<p>3、安装Cygwin</p>
<p>from:<a href="http://www.cygwin.cn/">http://www.cygwin.cn/</a></p>
<p>由于运行Nutch自带的脚本命令需要Linux的环境，所以必须首先安装Cygwin来模拟这种环境<br />
4、 nutch-1.0<br />
4.1 下载 <a href="http://www.apache.org/dyn/closer.cgi/lucene/nutch/">http://www.apache.org/dyn/closer.cgi/lucene/nutch/</a><a href="http://lucene.apache.org/nutch/"></a></p>
<p>4.2  解压后到C盘根目录</p>
<p>C:\nutch-1.0</p>
<p>建 url.txt文件，指定爬取列表<br />
在文件中写入如下内容：<br />
例如：<a href="http://cqllang.javaeye.com/blog">http://cqllang.javaeye.com/blog</a><br />
4.3  指定爬虫规则<br />
修改 conf/crawl-urlfilter.txt</p>
<p> </p>
<p>QUOTE:</p>
<p># accept hosts in MY.DOMAIN.NAME<br />
#+^<a href="http://(/">http://(</a>[a-z0-9]*\.)*MY.DOMAIN.NAME/<br />
把这里改成你要的域名<br />
如 +^<a href="http://cqllang.javaeye.com/blog">http://cqllang.javaeye.com/blog</a></p>
<p> </p>
<p>4.4 修改 conf/nutch-site.xml</p>
<p>QUOTE:</p>
<p>&lt;configuration&gt;<br />
        &lt;property&gt;<br />
                &lt;name&gt;http.agent.name&lt;/name&gt;<br />
                &lt;value&gt;my nutch agent&lt;/value&gt;<br />
        &lt;/property&gt;<br />
        &lt;property&gt;<br />
                &lt;name&gt;http.agent.version&lt;/name&gt;<br />
                &lt;value&gt;1.0&lt;/value&gt;<br />
        &lt;/property&gt;<br />
&lt;/configuration&gt;</p>
<p>如果没有配置此agent，爬取时会出现 Agent name not configured! 的错误。</p>
<p>4.5 开始爬取</p>
<p>打开Cygwin,</p>
<p>在命令行窗口中输入：  <br />
 　　cd /cygdrive/c/nutch-1.0<br />
执行命令：</p>
<p>bin/nutch crawl url.txt -dir crawled -depth 3 -threads 4 &gt;&amp; crawl.log</p>
<p>在这里</p>
<p>dir指定抓取内容所存放的目录，depth表示以要抓取网站顶级网址为起点的爬行深度，threads指定并发的线程数。</p>
<p>4.6 部署web前端<br />
将 nutch-1.0.war 拷贝到webapps目录下<br />
通过浏览器访问<a href="http://localhost:8080/nutch-0.9/">http://localhost:8080/nutch-1.0/</a> 后，war包自解压。<br />
4.7 修改nutch的web配置<br />
c:\tomcat6\webapps\nutch-1.0\WEB-INF\classes\nutch-site.xml<br />
将内容更改为索引生成的目录。<br />
QUOTE:</p>
<p>&lt;nutch-conf&gt;<br />
        &lt;property&gt;<br />
                &lt;name&gt;searcher.dir&lt;/name&gt;<br />
                &lt;value&gt;c:/nutch-1.0/crawled&lt;/value&gt;<br />
        &lt;/property&gt;<br />
&lt;/nutch-conf&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20090714/nutch1-0config.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>自己动手搭建搜索引擎(基于Nutch1.0)</title>
		<link>http://www.liulang.cq.cn/20090714/myselfconfignutch1-0.html</link>
		<comments>http://www.liulang.cq.cn/20090714/myselfconfignutch1-0.html#comments</comments>
		<pubDate>Tue, 14 Jul 2009 15:27:41 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[搜索引擎]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=7</guid>
		<description><![CDATA[
网上发现很多关于Nutch配置搜索引擎的文章，但我觉得对于很多新手来说。配置的话有时往往不知如何下手，下面推荐两个视频。帮助大家可以一步一步搭建自己的搜索引擎。
  
自己动手搭建搜索引擎 &#8211; 1
在线观看： http://www.boobooke.com/v/bbk2817
自己动手搭建搜索引擎 &#8211; 2
在线观看： http://www.boobooke.com/v/bbk2818
 
希望能帮助入门。有兴趣的可能研究nutch1.0源码。
]]></description>
			<content:encoded><![CDATA[<div>
<p>网上发现很多关于Nutch配置搜索引擎的文章，但我觉得对于很多新手来说。配置的话有时往往不知如何下手，下面推荐两个视频。帮助大家可以一步一步搭建自己的搜索引擎。</p>
<p>  </p>
<p>自己动手搭建搜索引擎 &#8211; 1</p>
<p>在线观看： <a href="http://www.boobooke.com/v/bbk2817" target="_blank">http://www.boobooke.com/v/bbk2817</a></p>
<p>自己动手搭建搜索引擎 &#8211; 2</p>
<p>在线观看： <a href="http://www.boobooke.com/v/bbk2818" target="_blank">http://www.boobooke.com/v/bbk2818</a></p>
<p> </p>
<p>希望能帮助入门。有兴趣的可能研究nutch1.0源码。</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20090714/myselfconfignutch1-0.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
