﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-刘文涛-随笔分类-Compass</title><link>http://www.blogjava.net/liuwentao253/category/19780.html</link><description>I am a coder</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 21:23:10 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 21:23:10 GMT</pubDate><ttl>60</ttl><item><title>Compass读文档笔记</title><link>http://www.blogjava.net/liuwentao253/archive/2007/02/06/98302.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Tue, 06 Feb 2007 06:31:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2007/02/06/98302.html</guid><description><![CDATA[  Compass是基于Lucene 的更高层的抽象，假如你正打算做关于搜索方面的模块的话，那我建议你使用Compass，他提供了可配置方案，而且比Lucene更加容易使用。如果你的系统中使用Spring， Hibernate，JDO， IBatis。。。 Compass是最好的选择，他能够非常方便的集成到现有系统中去。<br /><br />1.   Compass的framework的系统结构。<br />感觉Compass的代码的结构简直就是剽窃Hibernate的，可能Compass的最初目的是用来整合Hibernate的，<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">CompassConfiguration conf </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> CompassConfiguration().configure().addClass(Author.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Compass compass </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> conf.buildCompass();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />CompassSession session </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> compass.openSession();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />CompassTransaction tx </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_214_440_Open_Image" onclick="this.style.display='none'; Codehighlighter1_214_440_Open_Text.style.display='none'; Codehighlighter1_214_440_Closed_Image.style.display='inline'; Codehighlighter1_214_440_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_214_440_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_214_440_Closed_Text.style.display='none'; Codehighlighter1_214_440_Open_Image.style.display='inline'; Codehighlighter1_214_440_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_214_440_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_214_440_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    tx </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> session.beginTransaction();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <img src="http://www.blogjava.net/images/dot.gif" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    session.save(author);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    CompassHits hits </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> session.find(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">jack london</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    Author a </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (Author) hits.data(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    Resource r </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> hits.getResource(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <img src="http://www.blogjava.net/images/dot.gif" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    tx.commit();<br /><img id="Codehighlighter1_470_507_Open_Image" onclick="this.style.display='none'; Codehighlighter1_470_507_Open_Text.style.display='none'; Codehighlighter1_470_507_Closed_Image.style.display='inline'; Codehighlighter1_470_507_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_470_507_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_470_507_Closed_Text.style.display='none'; Codehighlighter1_470_507_Open_Image.style.display='inline'; Codehighlighter1_470_507_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />}</span></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (CompassException ce) </span><span id="Codehighlighter1_470_507_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_470_507_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (tx </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">) tx.rollback();<br /><img id="Codehighlighter1_517_540_Open_Image" onclick="this.style.display='none'; Codehighlighter1_517_540_Open_Text.style.display='none'; Codehighlighter1_517_540_Closed_Image.style.display='inline'; Codehighlighter1_517_540_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_517_540_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_517_540_Closed_Text.style.display='none'; Codehighlighter1_517_540_Open_Image.style.display='inline'; Codehighlighter1_517_540_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />}</span></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">finally</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_517_540_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_517_540_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    session.close();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><br /><br />假如你对Hibernate有了解的话，相信你对Compass会比较容易理解的，你可以把Hibernate的思想转移到Compass上。现在让我们看看他们之间的相似吧。<br />compass.cfg.xml<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">compass</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">core</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">config xmlns</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://www.opensymphony.com/compass/schema/core-config</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  xmlns:xsi</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://www.w3.org/2001/XMLSchema-instance</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  xsi:schemaLocation</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://www.opensymphony.com/compass/schema/core-config</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">           http:</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">www.opensymphony.com/compass/schema/compass-core-config.xsd"&gt;</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">compass name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">default</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    <u>  </u></span><u><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">connection</span><span style="COLOR: #000000">&gt;&lt;</span><span style="COLOR: #000000">file path</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">target/test-index</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;&lt;/</span><span style="COLOR: #000000">connection</span><span style="COLOR: #000000">&gt;</span></u><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    <u>  </u></span><u><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">mappings</span><span style="COLOR: #000000">&gt;&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test.Author</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/&gt;&lt;/</span><span style="COLOR: #000000">mappings</span><span style="COLOR: #000000">&gt;</span></u><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">compass</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">compass</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">core</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">config</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> </span></div><br />这个是Compass总的配置文件，其中定义了索引文件存储的位置（这里是用文件系统，Compass有多种选择，你也可以选数据库或其他），Compass索引的对象是面向PoJo的，这里的是Author，对应的文件是test/Author.cpm.xml.<br />当然这里面的配置属性不止这么多，更多的属性见Configure属性。<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">CompassConfiguration conf </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> CompassConfiguration()<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />     .setSetting(CompassEnvironment.CONNECTION, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">my/index/dir</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />     .addResource(DublinCore.cmd.xml).addClass(Author.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);<br /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Compass compass </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> conf.buildCompass();</span></div><br />这里我们CompassConfiguration会读取默认的在classpath中的compass.cfg.xml初始化，然后得到Compass对象，可能你会马上意思到这个Compass肯定对应于Hibenate中的SessionFactory，是的，这是一个重量级的对象，<br /><br />我们需要通过这个对象得到CompassSession，然后进行CRUD操作，CompassSession跟Hibernate中的Session一样是个lightweight对象。关于对Search domain的配置(Author.cpm.xml),大家可以查看cpm文件配置。在那里面主要是定义了哪些properties是需要被索引的。<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&lt;?</span><span style="COLOR: #000000">xml version</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">1.0</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">?&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">compass</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">core</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">mapping </span><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">eg</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Author</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> alias</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">author</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">id name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">id</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">constant</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">meta</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">data</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">type</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">meta</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">data</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">meta</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">data</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">person</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">meta</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">data</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">meta</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">data</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">author</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">meta</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">data</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">constant</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">meta</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">data</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">meta</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">data</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">meta</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">data</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">authorName</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">meta</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">data</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">property</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">birthday</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">meta</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">data</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">birthday</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">meta</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">data</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">property</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">component name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">books</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> ref</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">alias</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">book</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;!--</span><span style="COLOR: #000000"> can be a reference instead of component<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">reference name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">books</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> ref</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">alias</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">book</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">--&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Book</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> alias</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">book</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    <img src="http://www.blogjava.net/images/dot.gif" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">compass</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">core</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">mapping</span><span style="COLOR: #000000">&gt;</span></div><br />2.  索引文件结构<br />---[index dir]/index<br />  |<br />  |-- [subIndex1]<br />  |      |<br />  |      |--- segments<br />  |      |--- [segment1]<br />  |      |--- [segment2]<br />  |<br />  |-- [subIndex2]<br />  |      |<br />  |      |--- segments<br />  |      |--- [segment1]<br />  |      |--- [segment2]<br />  |      |--- [segment3]<br />  |<br />...<br />基本上是一个search domain放到一个subIndex文件夹中，更确切的说是相同alias name的search domain放到相同的sub index folder中。<br /><br />3.  Compass中的操作<br />通过CompassSession我们可以进行save，delete， get，load。假如我们有两个domain Object，Author 和 Book，假如我们想要query Book的话要怎样做呢？ 我们需要使用alias（这个属性定义在cmp文件中），<br />通过CompassQueryBuilder去构造CompassQuery, CompassQueryBuilder非常灵活，非常像Hibernate的Criteria查询。具体的sample请看 Working with objects  <br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">CompassHits hits </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> session.createQueryBuilder()<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  .queryString(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+name:jack +familyName:london</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    .setAnalyzer(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">an1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">) </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> use a different analyzer</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  .toQuery()<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    .addSort(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">familyName</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, CompassQuery.SortPropertyType.STRING)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    .addSort(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">birthdate</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, CompassQuery.SortPropertyType.INT)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  .hits();</span></div><br /><br />4.  CompassGps and CompassGpsDevice<br />CompassGps像是一个Service，他需要在application startup时启动服务， application shutdown停止服务，CompassGpsDevice不能独立的存在，他需要依赖CompassGps， CompassGps为CompassGpsDevice提供Compass对象，他们一起为程序提供Index的实时更新。 Compass整合Hibernate 等等 persitance framework的代码就在CompassGpsDevice里，你需要提供不同的Device，如HibernateDevice， JDODevice。你也<br />可以实现自己的Device， CompassGpsDevice会把domain object的更新事件通过CompassGps去通知Compass去更新索引文件，这样就是可以实时更新index了。有兴趣的话可以看看Hibernate3GpsDevice的registerEventsForHibernate31（）方法，他给Hibernate的save，delete，update操作增加listener。当然我们可以使用aop自己去实现这块。CompassGps and CompassGpsDevice  <br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">Compass compass </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> <img src="http://www.blogjava.net/images/dot.gif" /> </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> configure compass</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">CompassGps gps </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> SingleCompassGps(compass);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />CompassGpsDevice device1 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> <img src="http://www.blogjava.net/images/dot.gif" /> </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> configure the first device</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">device1.setName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">device1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />gps.addDevice(device1);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />CompassGpsDevice device2 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> <img src="http://www.blogjava.net/images/dot.gif" /> </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> configure the second device</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">device2.setName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">device2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />gps.addDevice(device2);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />gps.start();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><img src="http://www.blogjava.net/images/dot.gif" />.<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><img src="http://www.blogjava.net/images/dot.gif" />.<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">on application shutdown</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">gps.stop();</span></div><br />5.  整合Spring，Hibenate<br />在Compass的lib里面就有非常好的一个sample了（petclinic），里面有对Spring，Hibenate的整合，其实对spring来说也就是通过ioc把CompassGps 和 Compass定义好。CompassGps主要负责re－index和index实时更新<br />， Compass主要提供了自定义Search部分的入口（CompassTemplate）。Spring提供了对Compass的DAO的整合，在CompassDaoSupport 中拿到CompassTemplate，这个跟spring对hibernatedao的支持是一致的。<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_57_479_Open_Image" onclick="this.style.display='none'; Codehighlighter1_57_479_Open_Text.style.display='none'; Codehighlighter1_57_479_Closed_Image.style.display='inline'; Codehighlighter1_57_479_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_57_479_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_57_479_Closed_Text.style.display='none'; Codehighlighter1_57_479_Open_Image.style.display='inline'; Codehighlighter1_57_479_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> LibraryCompassDao </span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000"> CompassDaoSupport </span><span id="Codehighlighter1_57_479_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_57_479_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_110_441_Open_Image" onclick="this.style.display='none'; Codehighlighter1_110_441_Open_Text.style.display='none'; Codehighlighter1_110_441_Closed_Image.style.display='inline'; Codehighlighter1_110_441_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_110_441_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_110_441_Closed_Text.style.display='none'; Codehighlighter1_110_441_Open_Image.style.display='inline'; Codehighlighter1_110_441_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> getNumberOfHits(</span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000"> String query) </span><span id="Codehighlighter1_110_441_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_110_441_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       Integer numberOfHits </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (Integer)getCompassTemplate().execute(<br /><img id="Codehighlighter1_214_425_Open_Image" onclick="this.style.display='none'; Codehighlighter1_214_425_Open_Text.style.display='none'; Codehighlighter1_214_425_Closed_Image.style.display='inline'; Codehighlighter1_214_425_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_214_425_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_214_425_Closed_Text.style.display='none'; Codehighlighter1_214_425_Open_Image.style.display='inline'; Codehighlighter1_214_425_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />           </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> CompassCallback() </span><span id="Codehighlighter1_214_425_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_214_425_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_281_412_Open_Image" onclick="this.style.display='none'; Codehighlighter1_281_412_Open_Text.style.display='none'; Codehighlighter1_281_412_Closed_Image.style.display='inline'; Codehighlighter1_281_412_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_281_412_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_281_412_Closed_Text.style.display='none'; Codehighlighter1_281_412_Open_Image.style.display='inline'; Codehighlighter1_281_412_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />               </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Object doInCompass(CompassSession session) </span><span id="Codehighlighter1_281_412_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_281_412_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                  CompassHits hits </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> session.find(query);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                  </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Integer(hits.getLength());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />               }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />           }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> numberOfHits.intValue();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><br /><br />&lt;beans&gt;<br />   &lt;bean id="libraryCompass" class="LibraryCompassDao"&gt;<br />      &lt;property name="compass"&gt;<br />         &lt;ref local="compass" /&gt;<br />      &lt;/property&gt;<br />   &lt;/bean&gt;<br />&lt;/beans&gt;<br />         &lt;!-- COMPASS START --&gt;<br />    &lt;bean id="compass" class="org.compass.spring.LocalCompassBean"&gt;<br />        &lt;property name="resourceLocations"&gt;<br />            &lt;list&gt;<br />                &lt;value&gt;classpath:org/compass/sample/petclinic/petclinic.cmd.xml&lt;/value&gt;<br />                &lt;value&gt;classpath:petclinic.cpm.xml&lt;/value&gt;<br />            &lt;/list&gt;<br />        &lt;/property&gt;<br />        &lt;property name="compassSettings"&gt;<br />            &lt;props&gt;<br />                &lt;prop key="compass.engine.connection"&gt;file://${user.home}/compass/petclinic&lt;/prop&gt;<br />                &lt;prop key="compass.transaction.factory"&gt;org.compass.spring.transaction.SpringSyncTransactionFactory&lt;/prop&gt;<br />            &lt;/props&gt;<br />        &lt;/property&gt;<br />        &lt;property name="transactionManager"&gt;<br />            &lt;ref local="transactionManager" /&gt;<br />        &lt;/property&gt;<br />    &lt;/bean&gt;<br />         &lt;bean id="hibernateGpsDevice" class="org.compass.spring.device.hibernate.SpringHibernate3GpsDevice"&gt;<br />           &lt;property name="name"&gt;&lt;value&gt;hibernateDevice&lt;/value&gt;&lt;/property&gt;<br />           &lt;property name="sessionFactory"&gt;&lt;ref local="sessionFactory" /&gt;&lt;/property&gt;<br />         &lt;/bean&gt;<br />         &lt;bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps" init-method="start" destroy-method="stop"&gt;<br />           &lt;property name="compass"&gt;&lt;ref bean="compass" /&gt;&lt;/property&gt;<br />           &lt;property name="gpsDevices"&gt;<br />             &lt;list&gt;<br />               &lt;ref local="hibernateGpsDevice" /&gt;<br />             &lt;/list&gt;<br />           &lt;/property&gt;<br />         &lt;/bean&gt;<br />         &lt;!-- COMPASS END --&gt;<br />        &lt;!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) --&gt;<br />        &lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt;<br />                &lt;property name="sessionFactory"&gt;&lt;ref local="sessionFactory"/&gt;&lt;/property&gt;<br />        &lt;/bean&gt;<br /><br /><br />&lt;!----------------------------一下是对anototion的配置。--&gt;<br />    &lt;bean id="annotationConfiguration"<br />          class="org.compass.annotations.config.CompassAnnotationsConfiguration"&gt;<br />    &lt;/bean&gt;<br /><br />    &lt;!-- 核心Compass Bean,search及index时使用 --&gt;<br />    &lt;bean id="compass" class="org.compass.spring.LocalCompassBean"&gt;<br />        &lt;!-- anontaition式设置         --&gt;<br />        &lt;property name="classMappings"&gt;<br />            &lt;list&gt;<br />                &lt;value&gt;com.dengyin.compass.sample.domain.Book&lt;/value&gt;<br />            &lt;/list&gt;<br />        &lt;/property&gt;<br /><br />        &lt;property name="compassConfiguration" ref="annotationConfiguration"/&gt;<br /><br />        &lt;!-- xml 文件式设置<br />                        &lt;property name="resourceLocations"&gt;<br />                        &lt;list&gt;<br />                        &lt;value&gt;classpath:compass-springside.cmd.xml&lt;/value&gt;<br />                        &lt;value&gt;classpath:compass-springside.cpm.xml&lt;/value&gt;<br />                        &lt;/list&gt;<br />                        &lt;/property&gt;<br />                --&gt;<br />        &lt;property name="compassSettings"&gt;<br />            &lt;props&gt;<br />                &lt;prop key="compass.engine.connection"&gt;<br />                    file://${user.home}/springside/compass<br />                &lt;/prop&gt;<br />                &lt;prop key="compass.transaction.factory"&gt;<br />                    org.compass.spring.transaction.SpringSyncTransactionFactory<br />                &lt;/prop&gt;<br />            &lt;/props&gt;<br />        &lt;/property&gt;<br /><br />        &lt;property name="transactionManager" ref="transactionManager"/&gt;<br />    &lt;/bean&gt;<br /><br />    &lt;!--Compass的GPS绑定,在index时使用--&gt;<br />    &lt;bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps"<br />          init-method="start" destroy-method="stop"&gt;<br />        &lt;property name="compass" ref="compass"/&gt;<br />        &lt;property name="gpsDevices"&gt;<br />            &lt;list&gt;<br />                &lt;bean class="org.compass.spring.device.hibernate.SpringHibernate3GpsDevice"&gt;<br />                    &lt;property name="name"&gt;<br />                        &lt;value&gt;hibernateDevice&lt;/value&gt;<br />                    &lt;/property&gt;<br />                    &lt;property name="sessionFactory" ref="sessionFactory"/&gt;<br />                &lt;/bean&gt;<br />            &lt;/list&gt;<br />        &lt;/property&gt;<br />    &lt;/bean&gt;<br /><br />ok! 相信你对Compass有一定的了解了。 thanks<br /><img src ="http://www.blogjava.net/liuwentao253/aggbug/98302.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2007-02-06 14:31 <a href="http://www.blogjava.net/liuwentao253/archive/2007/02/06/98302.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>理解Compass的配置文件[转]</title><link>http://www.blogjava.net/liuwentao253/archive/2007/02/06/98284.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Tue, 06 Feb 2007 05:51:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2007/02/06/98284.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Compass是建立在Lucene基础之上的一款开放源码的JAVA搜索引擎框架。关于Compass的介绍在此我不多讲了，更多了解请直接参考http://www.opensymphony.com/compass。    很多看了Compass的人多少对Compass的配置文件都有点云里雾里的感觉。由于Compass有很多地方都借鉴了Hibernate的思想，在此我结合Hibernate中的思想来帮助...&nbsp;&nbsp;<a href='http://www.blogjava.net/liuwentao253/archive/2007/02/06/98284.html'>阅读全文</a><img src ="http://www.blogjava.net/liuwentao253/aggbug/98284.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2007-02-06 13:51 <a href="http://www.blogjava.net/liuwentao253/archive/2007/02/06/98284.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Compass学习文档</title><link>http://www.blogjava.net/liuwentao253/archive/2007/02/06/98210.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Tue, 06 Feb 2007 03:15:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2007/02/06/98210.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Compass是第一个实现java搜索引擎的开源框架,它是基于Lucene之上的，提供																更简单的搜索引擎API，事务支持，对象到搜索引擎映射（Annotations 						&amp;						 XML），Xml到搜索引擎映射，可以和Hibernate,Spring集成								，功能非常的强大。如果用Hibernate,Spr...&nbsp;&nbsp;<a href='http://www.blogjava.net/liuwentao253/archive/2007/02/06/98210.html'>阅读全文</a><img src ="http://www.blogjava.net/liuwentao253/aggbug/98210.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2007-02-06 11:15 <a href="http://www.blogjava.net/liuwentao253/archive/2007/02/06/98210.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Compass 指南</title><link>http://www.blogjava.net/liuwentao253/archive/2007/02/05/98088.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Mon, 05 Feb 2007 10:15:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2007/02/05/98088.html</guid><description><![CDATA[
		<h2>
				<a name="Compass-1.%E6%A6%82%E8%BF%B0">
				</a>1. 概述</h2>
		<p>    已加入Opensymphony的Compass 是对Lucene搜索引擎在企业应用（数据库相关应用）中的封装和增强。 Lucene本身的API已经非常简单，那Compass还能做什么样的增强呢？</p>
		<p>    心里数一下还是挺多的，不过可能只有一小部分适合自己的项目，在我的项目里最实际的增强就是索引的建立与Data Change Mirror的功能，其他功能用不用的上就要看缘分了。</p>
		<h3>
				<a name="Compass-1.1%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99">
				</a>1.1 参考资料</h3>
		<p>    <span class="nobr"><a title="Visit page outside Confluence" href="http://www.infoq.com/articles/compass-search-tutorial" rel="nofollow">InfoQ：Compass: Integrate Search into your apps<sup><a href="http://wiki.springside.org.cn/images/icons/linkext7.gif" target="_blank"><img class="rendericon" onmousewheel="return bbimg(this)" title="点击在新窗口查看原始图片" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" onload="java_script_:if(this.width&gt;500)this.width=500" align="absMiddle" border="0" /></a></sup></a></span></p>
		<h3>
				<a name="Compass-%26nbsp%3B1.2WhatSpringSideDone">
				</a> 1.2 What SpringSide Done</h3>
		<p>    SpringSide在core中仿照Compass的Spring MVC Controller封装了SearchService与Advanced SearchService，方便不使用Spring MVC的同志</p>
		<p>    同时在书店示例中演示了图书搜索及结果关键字高亮，在Spring启动时建立索引并基于Hibernate event机制的自动索引更新。</p>
		<h2>
				<a name="Compass-2.DataChangeMirror%E5%8A%9F%E8%83%BD">
				</a>2. <b>Data Change Mirror功能</b></h2>
		<p>    DataMirror会把数据库的增删改变化实时映射到索引文件中。</p>
		<p>    如果你采用Hibernate等ORM方案，Compass就会与Hibernate的event机制结合，或者使用AOP的方式，自动在数据库增删改时变更索引；如果你只是采用JDBC，也可以在XML文件配置Table Mapping或ResultSet Mapping，指定version列，Compasss定时对version列变化了的数据进行索引更新。</p>
		<p>    而且，Compass还支持事务，在查询数据库遍历结果集的过程中如果出现异常，会在Index Segments 文件一级进行事务控制。</p>
		<p>    如果没有Compass，我们一般会在每天深夜重建一次索引。相比Compass的做法，<br />    一来反应迟缓，平均延时半天；<br />    二来效率没有Compass高。如果采用完全重建索引，效率就不用说了。如果进行增量索引，就要增加一个字段，在数据更新时进行特殊的处理，删除时也不能直接删除数据，要等lucene删完索引数据才能删除，这样Lucene对应用就非常不透明了。<br />    三来不支持事务，如果建立索引过程中出现异常，索引文件的状态是不可控的。</p>
		<h2>
				<a name="Compass-3.Compass%E4%B8%8B%E7%AE%80%E5%8C%96%E7%9A%84%E7%B4%A2%E5%BC%95%E5%BB%BA%E7%AB%8B%E8%BF%87%E7%A8%8B">
				</a>3. Compass 下简化的索引建立过程</h2>
		<p>    在lucene 下建立索引的过程是自己用JDBC 跑SQL 获得ResultSet，遍历ResultSet建立Document对象并用IndexWriter写入文件目录。</p>
		<p>    在Compass下就变成一个宣告的过程：</p>
		<h3>
				<a name="Compass-3.1%E5%AE%A3%E5%91%8A%E5%BE%85%E6%90%9C%E7%B4%A2%E7%9A%84POJO">
				</a>3.1 宣告待搜索的POJO</h3>
		<p>   @SearchableId 宣告Document的id列；</p>
		<p>   @SearchableProperty 宣告要索引的field；</p>
		<p>   @SearchableComponent宣告关联其他对象如Category分类。<br />       	<span class="code-keyword"><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_25_169_Open_Image" onclick="this.style.display='none'; Codehighlighter1_25_169_Open_Text.style.display='none'; Codehighlighter1_25_169_Closed_Image.style.display='inline'; Codehighlighter1_25_169_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_25_169_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_25_169_Closed_Text.style.display='none'; Codehighlighter1_25_169_Open_Image.style.display='inline'; Codehighlighter1_25_169_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">   </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">  Product  </span><span id="Codehighlighter1_25_169_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_25_169_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      @SearchableId<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      privateInteger id;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      @SearchableProperty<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      privateString name;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      @SearchableComponent<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> Category category;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> }</span></span></div></span><a name="Compass-3.2%E5%AE%9A%E4%B9%89CompassGps"></a><br />3.2 定义CompassGps</p>
		<p>      CompassGps是Compass下用来建立索引，Mirror Data Change的类。</p>
		<p>      在ApplicationContext.xml定义了Compass与Spring的集成，配置参数，并让GPS随ApplicationContext启动开始监控Hibernate的DataChange ：</p>
		<ul>
				<li>Compass：核心定义类，定义要搜索的POJO 和 索引存储的路径。 
</li>
				<li>CompassGPS： 定义使用了Hibernate3GPS，定义了init-method 和destory-method，会自动随ApplicaitonContext的启动，开始监控Hibernate的变化。 </li>
		</ul>
		<div class="code">
				<div class="codeContent">
						<pre class="code-java">
								<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
										<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
										<span style="COLOR: #000000">&lt;!--</span>
										<span style="COLOR: #000000"> Compass中建立索引与mirror database change的部件 </span>
										<span style="COLOR: #000000">--&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
										</span>
										<span style="COLOR: #000000">&lt;</span>
										<span style="COLOR: #000000">bean id</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">compassGps</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">class</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">org.compass.gps.impl.SingleCompassGps</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">  init</span>
										<span style="COLOR: #000000">-</span>
										<span style="COLOR: #000000">method</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">start</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000"> destroy</span>
										<span style="COLOR: #000000">-</span>
										<span style="COLOR: #000000">method</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">stop</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
										<span style="COLOR: #000000">&lt;</span>
										<span style="COLOR: #000000">property name</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">compass</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000"> ref</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">compass</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">/&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
										<span style="COLOR: #000000">&lt;</span>
										<span style="COLOR: #000000">property name</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">gpsDevices</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
										<span style="COLOR: #000000">&lt;</span>
										<span style="COLOR: #000000">list</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span>
										<span style="COLOR: #000000">&lt;</span>
										<span style="COLOR: #000000">bean </span>
										<span style="COLOR: #0000ff">class</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">org.compass.spring.device.hibernate.SpringHibernate3GpsDevice</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                    </span>
										<span style="COLOR: #000000">&lt;</span>
										<span style="COLOR: #000000">property name</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">name</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000"> value</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">hibernateDevice</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">/&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                    </span>
										<span style="COLOR: #000000">&lt;</span>
										<span style="COLOR: #000000">property name</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">sessionFactory</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000"> ref</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">sessionFactory</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">/&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span>
										<span style="COLOR: #000000">&lt;/</span>
										<span style="COLOR: #000000">bean</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
										<span style="COLOR: #000000">&lt;/</span>
										<span style="COLOR: #000000">list</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
										<span style="COLOR: #000000">&lt;/</span>
										<span style="COLOR: #000000">property</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
										</span>
										<span style="COLOR: #000000">&lt;/</span>
										<span style="COLOR: #000000">bean</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
										</span>
										<span style="COLOR: #000000">&lt;</span>
										<span style="COLOR: #000000">bean id</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">compass</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">class</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">org.compass.spring.LocalCompassBean</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
										<span style="COLOR: #000000">&lt;!--</span>
										<span style="COLOR: #000000"> anontaition式设置 </span>
										<span style="COLOR: #000000">--&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
										<span style="COLOR: #000000">&lt;</span>
										<span style="COLOR: #000000">property name</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">classMappings</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
										<span style="COLOR: #000000">&lt;</span>
										<span style="COLOR: #000000">list</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span>
										<span style="COLOR: #000000">&lt;</span>
										<span style="COLOR: #000000">value</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">org.springside.bookstore.model.Book</span>
										<span style="COLOR: #000000">&lt;/</span>
										<span style="COLOR: #000000">value</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span>
										<span style="COLOR: #000000">&lt;</span>
										<span style="COLOR: #000000">value</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">org.springside.bookstore.model.Category</span>
										<span style="COLOR: #000000">&lt;/</span>
										<span style="COLOR: #000000">value</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
										<span style="COLOR: #000000">&lt;/</span>
										<span style="COLOR: #000000">list</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
										<span style="COLOR: #000000">&lt;/</span>
										<span style="COLOR: #000000">property</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
										<span style="COLOR: #000000">&lt;</span>
										<span style="COLOR: #000000">property name</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">compassConfiguration</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
										<span style="COLOR: #000000">&lt;</span>
										<span style="COLOR: #000000">bean </span>
										<span style="COLOR: #0000ff">class</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">org.compass.annotations.config.CompassAnnotationsConfiguration</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">/&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
										<span style="COLOR: #000000">&lt;/</span>
										<span style="COLOR: #000000">property</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
										<span style="COLOR: #000000">&lt;</span>
										<span style="COLOR: #000000">property name</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">compassSettings</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
										<span style="COLOR: #000000">&lt;</span>
										<span style="COLOR: #000000">props</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span>
										<span style="COLOR: #000000">&lt;</span>
										<span style="COLOR: #000000">prop key</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">compass.engine.connection</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                file:</span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">${user.home}/springside/compass</span>
										<span style="COLOR: #008000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
										</span>
										<span style="COLOR: #000000">            </span>
										<span style="COLOR: #000000">&lt;/</span>
										<span style="COLOR: #000000">prop</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span>
										<span style="COLOR: #000000">&lt;</span>
										<span style="COLOR: #000000">prop key</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">compass.transaction.factory</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                org.compass.spring.transaction.SpringSyncTransactionFactory<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span>
										<span style="COLOR: #000000">&lt;/</span>
										<span style="COLOR: #000000">prop</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
										<span style="COLOR: #000000">&lt;/</span>
										<span style="COLOR: #000000">props</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
										<span style="COLOR: #000000">&lt;/</span>
										<span style="COLOR: #000000">property</span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
										<span style="COLOR: #000000">&lt;</span>
										<span style="COLOR: #000000">property name</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">transactionManager</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000"> ref</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">transactionManager</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">/&gt;</span>
										<span style="COLOR: #000000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
										</span>
										<span style="COLOR: #000000">&lt;/</span>
										<span style="COLOR: #000000">bean</span>
										<span style="COLOR: #000000">&gt;</span>
								</div>
								<a name="Compass-3.3%E8%B0%83%E7%94%A8CompassGps.index%28%29">
								</a>
								<br />
								<br />3.3 调用CompassGps.index()</pre>
				</div>
		</div>
		<p>   上面的Gps定义只是自启动Mirror Data Change，但索引初始建立就需要靠程序员自己写代码调用CompassGps.index()来完成。</p>
		<p>   理论上，因为可以Mirror Data Change，所以索引只需要建立一次即可。如果索引已存在，Compass会对它gracefule override，所谓graceful，就是Compass会现在临时目录存放新的索引，新索引建立完毕后，再一次过覆盖旧索引，重建索引的漫长过程中，旧索引可以正常工作。</p>
		<p>   为了方便演示，在Bookstore示例里定义了一个CompassIndexBuilder，实现了Spring的InitializingBean接口，自动在Spring 启动时，启动一条线程进行索引重建。</p>
		<h2>
				<a name="Compass-4%26nbsp%3BCompassHighlighter">
				</a>4 Compass Highlighter</h2>
		<h3>
				<a name="Compass-4.1%26nbsp%3B%26nbsp%3B%E5%AE%9A%E4%B9%89Highlighter%E5%AD%97%E6%AE%B5">
				</a>4.1  定义Highlighter 字段</h3>
		<p>  只需要在AdvancedSearchCommand 上将需要highlighting 的Fields 加入即可。</p>
		<div class="code">
				<div class="codeContent">
						<pre class="code-java">  searchCommand.setHighlightFields(<span class="code-keyword">new</span><span class="code-object">String</span>[] {<span class="code-quote">"name"</span>});</pre>
				</div>
		</div>
		<h3>
				<a name="Compass-4.2%E5%AE%9A%E4%B9%89%E9%AB%98%E4%BA%AE%E7%9A%84%E6%A0%B7%E5%BC%8F">
				</a>4.2 定义高亮的样式</h3>
		<p>另外，如果对高亮显示的效果不满意的话，可以在applicationContext-compass.xml 文件里配置：</p>
		<div class="code">
				<div class="codeContent">
						<pre class="code-java">    &lt;prop key=<span class="code-quote">"compass.engine.highlighter.<span class="code-keyword">default</span>.formatter.simple.pre"</span>&gt;
     &lt;![CDATA[&lt;font color=<span class="code-quote">"red"</span>&gt;&lt;b&gt;]]&gt;
    &lt;/prop&gt;
    &lt;prop key=<span class="code-quote">"compass.engine.highlighter.<span class="code-keyword">default</span>.formatter.simple.post"</span>&gt;
     &lt;![CDATA[&lt;/b&gt;&lt;/font&gt;]]&gt;
    &lt;/prop&gt;</pre>
				</div>
		</div>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/98088.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2007-02-05 18:15 <a href="http://www.blogjava.net/liuwentao253/archive/2007/02/05/98088.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Compass--在Lucene之上作了什么增强?(Pragmatic系列) </title><link>http://www.blogjava.net/liuwentao253/archive/2007/02/05/98086.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Mon, 05 Feb 2007 10:06:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2007/02/05/98086.html</guid><description><![CDATA[已加入<a href="http://www.opensymphony.com/compass/"><font color="#366900">Opensymphony</font></a>的<a href="http://www.opensymphony.com/compass/"><font color="#366900">Compass</font></a> 是对<a href="http://lucene.apache.org/"><font color="#366900">Lucene搜索引擎</font></a>在企业应用（数据库应用）中的增强。 Lucene本身的API已经非常简单，看看IBM DW上的<a href="http://www.ibm.com/developerworks/library/wa-lucene2/"><font color="#366900">Beef up Web search apps with Lucene</font></a>已经大概了解，那Compass还能做什么样的增强呢？ 
<p>     <strong>1.在我的项目里，最实际的增强就是Data Mirror功能。</strong></p><p><strong>      </strong>DataMirror会把数据库的增删改变化实时映射到索引文件中。如果你采用Hibernate等ORM方案，你只须在POJO中进行annotation注释，Compass就会与Hibernate的event机制结合，或者使用AOP的方式，自动在数据库增删改时变更索引；如果你只是采用JDBC，也可以在XML文件配置Table Mapping或ResultSet Mapping，指定version列，Compasss定时进行索引更新。而且，Compass还支持事务，在查询数据库遍历结果集的过程中如果出现异常，会在Index Segments 文件一级进行事务控制。</p><p>    如果没有Compass，我们一般会在每天深夜重建一次索引。相比Compass的做法，<br />    一来反应迟缓，平均延时半天；<br />    二来效率没有Compass高。如果采用完全重建索引，效率就不用说了。如果进行增量索引，就要增加一个字段，在数据更新时进行特殊的处理，删除时也不能直接删除数据，要等lucene删完索引它才能删除，这样Lucene对应用就非常不透明了。<br />    三来不支持事务，如果建立索引过程中出现异常，索引文件的状态是不可控的。</p><p>   <strong> 2.Compass对查询的API也作了一定简化，可以考虑使用。</strong></p><p>    详见<a href="http://www.opensymphony.com/compass/versions/1.0.0/html/core-workingwithobjects.html#Searching"><font color="#366900">参考文档 10.5 Searching</font></a>， 简单直接用session find,如</p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><span style="COLOR: #000000">CompassHits hits </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> session.find(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">name:jack</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);</span></div></div><p>   加入排序，改分词Analyzer，用QueryBuilder()</p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">CompassHits hits </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> session.createQueryBuilder()<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />  .queryString(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+name:jack +familyName:london</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />    .setAnalyzer(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">an1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">) </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> use a different analyzer</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  .toQuery()<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />    .addSort(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">familyName</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, CompassQuery.SortPropertyType.STRING)<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />  .hits();<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span></div></div><p><br /><strong>3. Compass的其他功能，用不用的上要看缘份了：</strong> <br /><br />   将Lucene的索引文件放入数据库或内存。<br />   对索引文件根据不同的主题分开subIndex。<br />   对XML数据进行映射和索引....<strong><br /></strong><br /><strong>4.一段Pragmatic的Compass 搜索程序是这样写的：</strong></p><p>1.用annotation将pojo映射为searchable。(<a href="http://www.opensymphony.com/compass/versions/1.0.0/html/core-osem-annotations.html"><font color="#366900">详细请看参考文档</font></a>，如果没有JDK5,可以参考<a href="http://www.opensymphony.com/compass/versions/1.0.0/html/core-osem-xml.html"><font color="#366900">XML式的配置</font></a>)</p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Product  {  <br /> @SearchableId<br /> </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> Integer id;<br /> </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> String name;<br /> @SearchableProperty(name </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> String getName() {<br />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.name;<br />    }<br />}</span></div></div><p>2.用<a href="http://www.opensymphony.com/compass/versions/1.0.0/html/core-configuration.html#XmlConfigurationSchema"><font color="#366900">Compass提供的Spring2 Schema</font></a> 来配置Compass与Hibernate,Spring的结合。<br />   <a href="http://www.opensymphony.com/compass/versions/1.0.0/html/core-configuration.html#XmlConfigurationSchema"><font color="#366900">SchemaBase的配</font></a>置是Spring 2.0的新特征，相比原来的配置代码要少一些。</p><p>3.编写搜索结果显示页，将Hits，Command，Page三个变量显示出来。<br />   Compass的代码重用已经到了Controller一级，只要给Controller 配上compass bean和结果显示的jsp就可以了。Controller提供足够的配置参数，使它完全可以被配置重用，这是个值得SpringSide学习的地方。<br />   即使你的web应用不是采用Spring MVC，如果没有大规模改写的需求，也可以直接使用，让Struts与Spring MVC并存。</p><p> <strong>5.Controller默认的查询需要扩展时</strong></p><p><strong>    </strong>Contrller默认的查询是在所有fileld里查询关键字，如果需要限定field，加入排序，加入and ,exclude，模糊查询等就不适用了。高级搜索页一般会提供比较多的过滤条件输入框让用户输入，然后在Controller对这些输入条件进行重新组合。</p><p>    组合的方式既可以按<a href="http://lucene.apache.org/java/docs/queryparsersyntax.html"><font color="#366900">Lucene的Query语法</font></a>进行拼SQL式的组合，最后得到"+name:jack -familyName:london" 这样的句子。</p><p>    也可以用类似Hibernate Criteria API的方式，如：</p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><span style="COLOR: #000000">CompassHits hits </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  session.createQueryBuilder().bool()<br />    .addMust( queryBuilder.term(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">jack</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">) )<br />    .addMustNot( queryBuilder.term(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">familyName</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">london</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">) )<br />  .toQuery() .hits();</span></div></div><p><br />    因此，如果你的Lucene应用是面向数据库的，就不妨用一下Compass。<br />     Compass另一个让我学习的地方是它充分考虑用户客户化的需要，enough thing can be configure ，从而连Controller也可以重用的做法。 </p><img src ="http://www.blogjava.net/liuwentao253/aggbug/98086.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2007-02-05 18:06 <a href="http://www.blogjava.net/liuwentao253/archive/2007/02/05/98086.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用Compass实现一个简单的搜索引擎[转贴]</title><link>http://www.blogjava.net/liuwentao253/archive/2007/02/05/98072.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Mon, 05 Feb 2007 09:27:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2007/02/05/98072.html</guid><description><![CDATA[
		<p>  Compass是一流的开放源码JAVA搜索引擎框架，对于你的应用修饰，搜索引擎语义更具有能力。依靠顶级的Lucene搜索引擎，Compass 结合了，像 Hibernate和 Sprin的流行的框架，为你的应用提供了从数据模型和数据源同步改变的搜索力.并且添加了2方面的特征,事物管理和快速更新优化. Compass的目标是：把java应用简单集成到搜索引擎中.编码更少，查找数据更便捷。<br /><br />  下面以一个应用场景分步骤讲解如何利用compass实现搜索引擎：<br /><br />1. 这里我们有一个Article表，希望利用compass实现对它的搜索。<br /><br />Article的结构如下：</p>
		<p>CREATE TABLE `article` (<br />  `ArticleID` bigint(20) NOT NULL,<br />  `PersonInfoID` bigint(20) default NULL,<br />  `ArticleTitle` varchar(200) default NULL,<br />  `PublishDate` datetime default NULL,<br />  `Summary` text,<br />  `Content` longtext,<br />  `KeyList` text,<br />  PRIMARY KEY (`ArticleID`),<br />  KEY `PersonInfoArticle_FK` (`PersonInfoID`)<br />) ENGINE=InnoDB DEFAULT CHARSET=utf8;</p>
		<p>我们希望利用compass对它的ArticleTitle、Summary、Content和KeyList进行全文检索。下面开始行动吧。</p>
		<p>2. 首先到<a href="http://www.opensymphony.com/compass/download.action">http://www.opensymphony.com/compass/download.action</a> 上下载一个compass的发布版，我们下载的是Version 1.0.0的With Dependencies 。这样就可能省去寻找相关信赖库的麻烦了。</p>
		<p>3. 将compass1.0解压到一个合适的目录，我们的工作目录是d:\develop\compass1.0</p>
		<p>4. 我们是在eclipse环境下实现当前要求的，所以建议你也安装一个eclipse 3.2。</p>
		<p>5. 首先我们在eclipse中建立了一个java工程，名为mycompass。</p>
		<p>6. 然后我们在工程目录中建立了一个lib目录，用来存放本次工程所需要的所有compass和其它相关的库文件，并将他们设置为当前工程构建路径中需要的库文件。所有这些文件可以在compass的安装目录的lib目录找到。</p>
		<p>下面是我们的库文件列表：</p>
		<p>7. 建立了Article表的pojo类。</p>
		<p>CODE:</p>
		<p>package com.darkhe.sample.mycompass;</p>
		<p>// Generated 2006-8-2 10:57:06 by Hibernate Tools 3.2.0.beta6a</p>
		<p>import java.util.Date;</p>
		<p>/**<br />  * Article generated by hbm2java<br />  */<br />public class Article implements java.io.Serializable {</p>
		<p>  // Fields   </p>
		<p>  private long articleId;</p>
		<p>  private Long personInfoId;</p>
		<p>  private String articleTitle;</p>
		<p>  private Date publishDate;</p>
		<p>  private String summary;</p>
		<p>  private String content;</p>
		<p>  private String keyList;</p>
		<p>  // Constructors</p>
		<p>  /** default constructor */<br />  public Article() {<br />  }</p>
		<p>  /** minimal constructor */<br />  public Article(long articleId) {<br />  this.articleId = articleId;<br />  }</p>
		<p>  /** full constructor */<br />  public Article(long articleId, Long personInfoId, String articleTitle,<br />  Date publishDate, String summary, String content, String keyList) {<br />  this.articleId = articleId;<br />  this.personInfoId = personInfoId;<br />  this.articleTitle = articleTitle;<br />  this.publishDate = publishDate;<br />  this.summary = summary;<br />  this.content = content;<br />  this.keyList = keyList;<br />  }</p>
		<p>  // Property accessors<br />  public long getArticleId() {<br />  return this.articleId;<br />  }</p>
		<p>  public void setArticleId(long articleId) {<br />  this.articleId = articleId;<br />  }</p>
		<p>  public Long getPersonInfoId() {<br />  return this.personInfoId;<br />  }</p>
		<p>  public void setPersonInfoId(Long personInfoId) {<br />  this.personInfoId = personInfoId;<br />  }</p>
		<p>  public String getArticleTitle() {<br />  return this.articleTitle;<br />  }</p>
		<p>  public void setArticleTitle(String articleTitle) {<br />  this.articleTitle = articleTitle;<br />  }</p>
		<p>  public Date getPublishDate() {<br />  return this.publishDate;<br />  }</p>
		<p>  public void setPublishDate(Date publishDate) {<br />  this.publishDate = publishDate;<br />  }</p>
		<p>  public String getSummary() {<br />  return this.summary;<br />  }</p>
		<p>  public void setSummary(String summary) {<br />  this.summary = summary;<br />  }</p>
		<p>  public String getContent() {<br />  return this.content;<br />  }</p>
		<p>  public void setContent(String content) {<br />  this.content = content;<br />  }</p>
		<p>  public String getKeyList() {<br />  return this.keyList;<br />  }</p>
		<p>  public void setKeyList(String keyList) {<br />  this.keyList = keyList;<br />  }</p>
		<p>}</p>
		<p>
				<br />[Copy to clipboard]</p>
		<p>8. 建立hibernate的pojo到数据表映射文件</p>
		<p>CODE:</p>
		<p>&lt;?xml version="1.0"?&gt;<br />&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />"[url]http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd[/url]"&gt;<br />&lt;!-- Generated 2006-8-2 10:57:07 by Hibernate Tools 3.2.0.beta6a --&gt;<br />&lt;hibernate-mapping&gt;<br />  &lt;class name="com.darkhe.sample.mycompass.Article" table="article" catalog="freedom"&gt;<br />    &lt;comment&gt;&lt;/comment&gt;<br />    &lt;id name="articleId" type="long"&gt;<br />        &lt;column name="ArticleID" /&gt;<br />        &lt;generator class="assigned" /&gt;<br />    &lt;/id&gt;<br />    &lt;property name="personInfoId" type="java.lang.Long"&gt;<br />        &lt;column name="PersonInfoID"&gt;<br />          &lt;comment&gt;&lt;/comment&gt;<br />        &lt;/column&gt;<br />    &lt;/property&gt;<br />    &lt;property name="articleTitle" type="string"&gt;<br />        &lt;column name="ArticleTitle" length="200"&gt;<br />          &lt;comment&gt;&lt;/comment&gt;<br />        &lt;/column&gt;<br />    &lt;/property&gt;<br />    &lt;property name="publishDate" type="timestamp"&gt;<br />        &lt;column name="PublishDate" length="19"&gt;<br />          &lt;comment&gt;&lt;/comment&gt;<br />        &lt;/column&gt;<br />    &lt;/property&gt;<br />    &lt;property name="summary" type="string"&gt;<br />        &lt;column name="Summary" length="65535"&gt;<br />          &lt;comment&gt;&lt;/comment&gt;<br />        &lt;/column&gt;<br />    &lt;/property&gt;<br />    &lt;property name="content" type="string"&gt;<br />        &lt;column name="Content"&gt;<br />          &lt;comment&gt;&lt;/comment&gt;<br />        &lt;/column&gt;<br />    &lt;/property&gt;<br />    &lt;property name="keyList" type="string"&gt;<br />        &lt;column name="KeyList" length="65535"&gt;<br />          &lt;comment&gt;&lt;/comment&gt;<br />        &lt;/column&gt;<br />    &lt;/property&gt;<br />  &lt;/class&gt;<br />&lt;/hibernate-mapping&gt;</p>
		<p>
				<br />[Copy to clipboard]</p>
		<p>9. 开始配置compass，首先是compass的系统配置文件 mycompass.cfg.xml</p>
		<p>CODE:</p>
		<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;compass-core-config<br />xmlns="[url]http://www.opensymphony.com/compass/schema/core-config[/url]"<br />xmlns:xsi="[url]http://www.w3.org/2001/XMLSchema-instance[/url]"<br />xsi:schemaLocation="[url]http://www.opensymphony.com/compass/schema/core-config[/url]<br />      [url]http://www.opensymphony.com/compass/schema/compass-core-config.xsd[/url]"&gt;</p>
		<p>&lt;compass name="default"&gt; &lt;!—这个名字随你取了，但它是必须的--&gt;</p>
		<p>&lt;connection&gt;<br />  &lt;file path="target" /&gt; &lt;!—这里是索引文件的存放路径，我们设置的是当前工程的相对路径target-?<br />&lt;/connection&gt;</p>
		<p>&lt;searchEngine&gt;<br />  &lt;!-- 因是使用自己的分词算法，所以这里的类型必须是CustomAnalyzer --&gt;<br />      &lt;analyzer name="MMAnalyer" type="CustomAnalyzer" analyzerClass="jeasy.analysis.MMAnalyzer"&gt;<br />        &lt;stopWords&gt;<br />            &lt;stopWord value="test" /&gt;<br />        &lt;/stopWords&gt;<br />      &lt;/analyzer&gt;<br />    &lt;/searchEngine&gt;</p>
		<p>&lt;/compass&gt;<br />&lt;/compass-core-config&gt;</p>
		<p>[Copy to clipboard]</p>
		<p>在上面的配置中，我们使用的我们选用的一个中文分词算法库，你可以用compass自带的。具体compass提供了哪些分词算法，请查阅compass的手册。</p>
		<p>
				<br />10. 然后是mycompass.cmd.xml </p>
		<p>CODE:</p>
		<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE compass-core-meta-data PUBLIC <br />  "-//Compass/Compass Core Meta Data DTD 1.0//EN"<br />  "[url]http://www.opensymphony.com/compass/dtd/compass-core-meta-data.dtd[/url]"&gt;</p>
		<p>&lt;compass-core-meta-data&gt;</p>
		<p>&lt;!-- 定义一个实体和字段组--&gt;<br />  &lt;meta-data-group id="mycompass" displayName="My Compass"&gt;<br />  <br />    &lt;description&gt;Mycompass Meta Data&lt;/description&gt;     <br />    &lt;uri&gt;[url]http://com/darkhe/sample/mycompass&lt;/uri&gt;[/url]<br />  <br />    <br />&lt;!-- 申明所有需要检索的实体--&gt;     <br />    &lt;alias id="Article" displayName="Article"&gt;<br />        &lt;description&gt;Article alias&lt;/description&gt;<br />        &lt;uri&gt;[url]http://com/darkhe/sample/mycompass/alias/Article&lt;/uri&gt;[/url]<br />        &lt;name&gt;Article&lt;/name&gt;<br />    &lt;/alias&gt;<br />    <br />&lt;!-- 申明所有需要检索的属性或者字段，而不管这些属性或者字段是哪个实体的 --&gt;     <br />    &lt;meta-data id="ArticleTitle" displayName="ArticleTitle"&gt;<br />        &lt;description&gt;ArticleTitle&lt;/description&gt;<br />        &lt;uri&gt;[url]http://com/darkhe/sample/mycompass/alias/ArticleTitle&lt;/uri&gt;[/url]<br />        &lt;name&gt;ArticleTitle&lt;/name&gt;<br />    &lt;/meta-data&gt;<br />    <br />    &lt;meta-data id="PublishDate" displayName="PublishDate"&gt;<br />        &lt;description&gt;PublishDate&lt;/description&gt;<br />        &lt;uri&gt;[url]http://com/darkhe/sample/mycompass/alias/PublishDate&lt;/uri&gt;[/url]<br />        &lt;name format="yyyy-MM-dd hh:mm:ss"&gt;date&lt;/name&gt;<br />    &lt;/meta-data&gt;<br />    <br />    &lt;meta-data id="Summary" displayName="Summary"&gt;<br />        &lt;description&gt;Summary&lt;/description&gt;<br />        &lt;uri&gt;[url]http://com/darkhe/sample/mycompass/alias/Summary&lt;/uri&gt;[/url]<br />        &lt;name&gt;Summary&lt;/name&gt;<br />    &lt;/meta-data&gt;<br />    <br />    &lt;meta-data id="Content" displayName="Content"&gt;<br />        &lt;description&gt;Content&lt;/description&gt;<br />        &lt;uri&gt;[url]http://com/darkhe/sample/mycompass/alias/Content&lt;/uri&gt;[/url]<br />        &lt;name&gt;Content&lt;/name&gt;<br />    &lt;/meta-data&gt;</p>
		<p>    &lt;meta-data id="KeyList" displayName="KeyList"&gt;<br />        &lt;description&gt;KeyList&lt;/description&gt;<br />        &lt;uri&gt;[url]http://com/darkhe/sample/mycompass/alias/KeyList&lt;/uri&gt;[/url]<br />        &lt;name&gt;KeyList&lt;/name&gt;<br />    &lt;/meta-data&gt;     <br />                <br />  &lt;/meta-data-group&gt;<br />  <br />&lt;/compass-core-meta-data&gt;</p>
		<p>[Copy to clipboard]</p>
		<p>
				<br />11. 再是mycompass.cpm.xml</p>
		<p>CODE:</p>
		<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE compass-core-mapping PUBLIC<br />  "-//Compass/Compass Core Mapping DTD 1.0//EN"<br />  "[url]http://www.opensymphony.com/compass/dtd/compass-core-mapping.dtd[/url]"&gt;</p>
		<p>&lt;!-- 这里的包名必须和pojo的包名一致 --&gt;<br />&lt;compass-core-mapping package="com.darkhe.sample.mycompass"&gt;</p>
		<p>&lt;!-- 定义实体及其字段的对应关系 --&gt;</p>
		<p>&lt;!-- 注意实体及其字段的名称的大小写应当与pojo对象一致，而不是与数据库一致<br />关于pojo与数据库的对应表的一致性关系由hibernate的映谢文件定义，而不是这个文件<br />当前映射文件只定义compass与hibernate的关系 --&gt;</p>
		<p>&lt;class name="Article" alias="${mycompass.Article}"&gt;<br />&lt;id name="ArticleId" /&gt;</p>
		<p>&lt;property name="ArticleTitle"&gt;<br />  &lt;meta-data&gt;${mycompass.ArticleTitle}&lt;/meta-data&gt;<br />&lt;/property&gt;</p>
		<p>&lt;property name="PublishDate"&gt;<br />  &lt;meta-data&gt;${mycompass.PublishDate}&lt;/meta-data&gt;<br />&lt;/property&gt;</p>
		<p>&lt;property name="Summary"&gt;<br />  &lt;meta-data&gt;${mycompass.Summary}&lt;/meta-data&gt;<br />&lt;/property&gt;</p>
		<p>&lt;property name="Content"&gt;<br />  &lt;meta-data&gt;${mycompass.Content}&lt;/meta-data&gt;<br />&lt;/property&gt;</p>
		<p>&lt;property name="KeyList"&gt;<br />  &lt;meta-data&gt;${mycompass.KeyList}&lt;/meta-data&gt;<br />&lt;/property&gt;<br />&lt;/class&gt;<br />&lt;/compass-core-mapping&gt;</p>
		<p>
				<br />[Copy to clipboard]</p>
		<p>12. log4j.properties</p>
		<p>CODE:</p>
		<p>log4j.rootLogger=WARN, stdout<br />log4j.appender.stdout=org.apache.log4j.ConsoleAppender<br />log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<br />log4j.appender.stdout.layout.ConversionPattern=%d %p %c - %m%n<br />log4j.logger.org.compass=INFO</p>
		<p>[Copy to clipboard]</p>
		<p>
				<br />13. jdbc.properties</p>
		<p>CODE:</p>
		<p># Properties file with JDBC-related settings.<br /># Applied by PropertyPlaceholderConfigurer from "applicationContext-*.xml".<br /># Targeted at system administrators, to avoid touching the context XML files.<br />jdbc.driverClassName=com.mysql.jdbc.Driver<br />#jdbc.driverClassName=org.hsqldb.jdbcDriver<br />#jdbc.url=jdbc:hsqldb:hsql://localhost:9001<br />jdbc.url=jdbc:mysql://localhost:3306/testdb<br />jdbc.username=test<br />jdbc.password=test<br /># Property that determines the Hibernate dialect<br /># (only applied with "applicationContext-hibernate.xml")<br />#hibernate.dialect=org.hibernate.dialect.HSQLDialect<br />hibernate.dialect=org.hibernate.dialect.MySQLDialect</p>
		<p>[Copy to clipboard]</p>
		<p>
				<br />14. 最后是applicationContext-hibernate.xml，这里集中配置了compass如何与spring与hibernate结合的。</p>
		<p>CODE:</p>
		<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "[url]http://www.springframework.org/dtd/spring-beans.dtd[/url]"&gt;</p>
		<p>&lt;!--<br />- Application context definition for Petclinic on Hibernate.<br />--&gt;<br />&lt;beans&gt;<br />&lt;!-- ========================= RESOURCE DEFINITIONS ========================= --&gt;<br />&lt;!-- Configurer that replaces ${...} placeholders with values from a properties file --&gt;<br />&lt;!-- (in this case, JDBC-related settings for the dataSource definition below) --&gt;<br />&lt;bean id="propertyConfigurer"<br />class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt;<br />&lt;property name="location"&gt;<br />  &lt;value&gt;classpath:jdbc.properties&lt;/value&gt;<br />&lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;!-- Local DataSource that works in any environment --&gt;<br />&lt;!-- Note that DriverManagerDataSource does not pool; it is not intended for production --&gt;<br />&lt;!-- See JPetStore for an example of using Commons DBCP BasicDataSource as alternative --&gt;<br />&lt;!-- See Image Database for an example of using C3P0 ComboPooledDataSource as alternative --&gt;<br />&lt;bean id="dataSource"<br />class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt;<br />&lt;property name="driverClassName"&gt;<br />  &lt;value&gt;${jdbc.driverClassName}&lt;/value&gt;<br />&lt;/property&gt;<br />&lt;property name="url"&gt;<br />  &lt;value&gt;${jdbc.url}&lt;/value&gt;<br />&lt;/property&gt;<br />&lt;property name="username"&gt;<br />  &lt;value&gt;${jdbc.username}&lt;/value&gt;<br />&lt;/property&gt;<br />&lt;property name="password"&gt;<br />  &lt;value&gt;${jdbc.password}&lt;/value&gt;<br />&lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;!-- JNDI DataSource for J2EE environments --&gt;<br />&lt;!--<br />&lt;bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"&gt;<br />&lt;property name="jndiName"&gt;&lt;value&gt;java:comp/env/jdbc/petclinic&lt;/value&gt;&lt;/property&gt;<br />&lt;/bean&gt;<br />--&gt;<br />&lt;!-- Hibernate SessionFactory --&gt;<br />&lt;bean id="sessionFactory"<br />class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br />&lt;property name="dataSource"&gt;<br />  &lt;ref local="dataSource" /&gt;<br />&lt;/property&gt;<br />&lt;property name="mappingResources"&gt;<br />  &lt;list&gt;<br />  &lt;value&gt;<br />  com/darkhe/sample/mycompass/Article.hbm.xml &lt;!-- 这里是hibernate里需要的数据映射文件 --&gt;<br />  &lt;/value&gt;<br />  &lt;/list&gt;<br />&lt;/property&gt;<br />&lt;property name="hibernateProperties"&gt;<br />  &lt;props&gt;<br />  &lt;prop key="hibernate.dialect"&gt;<br />  ${hibernate.dialect}<br />  &lt;/prop&gt;<br />  &lt;prop key="hibernate.show_sql"&gt;false&lt;/prop&gt;<br />  &lt;prop key="hibernate.generate_statistics"&gt;true&lt;/prop&gt;<br />  &lt;/props&gt;<br />&lt;/property&gt;<br />&lt;property name="eventListeners"&gt;<br />  &lt;map&gt;<br />  &lt;entry key="merge"&gt;<br />  &lt;bean<br />    class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener" /&gt;<br />  &lt;/entry&gt;<br />  &lt;/map&gt;<br />&lt;/property&gt;<br />&lt;/bean&gt;</p>
		<p>
				<br />&lt;!-- COMPASS START --&gt;<br />&lt;bean id="compass" class="org.compass.spring.LocalCompassBean"&gt;<br />&lt;property name="resourceLocations"&gt;<br />  &lt;list&gt;<br />  &lt;value&gt;classpath:mycompass.cmd.xml&lt;/value&gt; &lt;!-- 这里是compass所需要的两个关于数据项的配置文件 --&gt;<br />  &lt;value&gt;classpath:mycompass.cpm.xml&lt;/value&gt;<br />  &lt;/list&gt;<br />&lt;/property&gt;<br />&lt;property name="configLocation"&gt;<br />  &lt;value&gt;classpath:mycompass.cfg.xml&lt;/value&gt; &lt;!-- 这里是compass的系统配置文件的路径 --&gt;<br />&lt;/property&gt;<br />&lt;!--       &lt;property name="compassSettings"&gt;<br />  &lt;props&gt;<br />  &lt;prop key="compass.engine.connection"&gt;file://d:/target&lt;/prop&gt;<br />  &lt;prop key="compass.transaction.factory"&gt;org.compass.spring.transaction.SpringSyncTransactionFactory&lt;/prop&gt;<br />  &lt;/props&gt;<br />  &lt;/property&gt;--&gt;</p>
		<p>&lt;property name="transactionManager"&gt;<br />  &lt;ref local="transactionManager" /&gt;<br />&lt;/property&gt;<br />&lt;/bean&gt;</p>
		<p>
				<br />&lt;bean id="hibernateGpsDevice"<br />class="org.compass.spring.device.hibernate.SpringHibernate3GpsDevice"&gt;<br />&lt;property name="name"&gt;<br />  &lt;value&gt;hibernateDevice&lt;/value&gt;<br />&lt;/property&gt;<br />&lt;property name="sessionFactory"&gt;<br />  &lt;ref local="sessionFactory" /&gt;<br />&lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps"<br />init-method="start" destroy-method="stop"&gt;<br />&lt;property name="compass"&gt;<br />  &lt;ref bean="compass" /&gt;<br />&lt;/property&gt;<br />&lt;property name="gpsDevices"&gt;<br />  &lt;list&gt;<br />  &lt;bean<br />  class="org.compass.spring.device.SpringSyncTransactionGpsDeviceWrapper"&gt;<br />  &lt;property name="gpsDevice" ref="hibernateGpsDevice" /&gt;<br />  &lt;/bean&gt;<br />  &lt;/list&gt;<br />&lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;!-- COMPASS END --&gt;<br />&lt;/beans&gt;</p>
		<p>[Copy to clipboard]</p>
		<p>15. 注意上面的所以配置文件，根据我们上面的配置，都应当放到classpath的根路径。<br />16. 建立工具类，用来进行spring引擎的初始化工作。</p>
		<p>CODE:</p>
		<p>/**<br />* &lt;p&gt;@(#) IOC.java 2006-2-1 0:08:23&lt;/p&gt;<br />* &lt;p&gt;Copyright (c) 2005-2006 ???????????????????&lt;/p&gt;<br />*/<br />package com.darkhe.sample.mycompass;</p>
		<p>import org.springframework.context.ApplicationContext;<br />import org.springframework.context.support.ClassPathXmlApplicationContext;</p>
		<p>/**<br />* <br />* <br />* @version 1.0 2006-2-1<br />* @author darkhe<br />*/<br />public class IOC {<br />private static ApplicationContext context = null;</p>
		<p>private static boolean isInit = false;</p>
		<p>private IOC() {<br />super();<br />}</p>
		<p>private static void init() {</p>
		<p>if (isInit == false) {<br />  String[] xmlfilenames = { "applicationContext-hibernate.xml" };</p>
		<p>  context = new ClassPathXmlApplicationContext(xmlfilenames);</p>
		<p>  isInit = true;<br />}<br />}</p>
		<p>/**<br />* <br />* @return<br />*/<br />public static ApplicationContext getContext() {<br />if (context == null || isInit == false) {<br />  init();<br />}<br />return context;<br />}</p>
		<p>/**<br />* <br />* @param name<br />* @return<br />*/<br />public static Object getBean(String name) {<br />return getContext().getBean(name);<br />}</p>
		<p>}</p>
		<p>
				<br />[Copy to clipboard]</p>
		<p>17. 建立索引程序，用来数据库中的建立索引</p>
		<p>CODE:</p>
		<p>/*<br />* Copyright (c) 2005-2006 <br />* ChongQing Man-Month Technology Development Co. ,Ltd<br />* <br />* ---------------------------------------------------------------------------------<br />* @(#) Inder.java, 2006-8-1 下午09:01:14<br />* ---------------------------------------------------------------------------------<br />*/<br />package com.darkhe.sample.mycompass;</p>
		<p>import java.io.FileNotFoundException;</p>
		<p>import org.compass.gps.CompassGps;<br />import org.springframework.context.ApplicationContext;</p>
		<p>/**<br />* @author darkhe<br />* <br />*/<br />public class Indexer {</p>
		<p>/**<br />* @param args<br />* @throws FileNotFoundException <br />*/<br />public static void main(String[] args) throws FileNotFoundException {</p>
		<p>  // 加裁自定义词典<br />DictionaryUtils.loadCustomDictionary();</p>
		<p>ApplicationContext context = IOC.getContext();</p>
		<p>// 得到spring环境中已经配置和初始化好的compassGps对象<br />CompassGps compassGps = (CompassGps) context.getBean("compassGps");<br />// 调用index方法建立索引<br />compassGps.index();</p>
		<p>}</p>
		<p>}</p>
		<p>[Copy to clipboard]</p>
		<p>
				<br />18. 建立搜索程序，检证compass的应用。</p>
		<p>CODE:</p>
		<p>/*<br />* Copyright (c) 2005-2006 <br />* ChongQing Man-Month Technology Development Co. ,Ltd<br />* <br />* ---------------------------------------------------------------------------------<br />* @(#) Searcher.java, 2006-8-1 下午09:36:29<br />* ---------------------------------------------------------------------------------<br />*/</p>
		<p>package com.darkhe.sample.mycompass;</p>
		<p>import java.io.FileNotFoundException;</p>
		<p>import org.compass.core.Compass;<br />import org.compass.core.CompassCallbackWithoutResult;<br />import org.compass.core.CompassException;<br />import org.compass.core.CompassHits;<br />import org.compass.core.CompassSession;<br />import org.compass.core.CompassTemplate;<br />import org.compass.core.Resource;<br />import org.springframework.context.ApplicationContext;</p>
		<p>/**<br />* @author darkhe<br />* <br />*/<br />public class Searcher {</p>
		<p>/**<br />* @param args<br />* @throws FileNotFoundException<br />*/<br />public static void main(String[] args) throws FileNotFoundException {</p>
		<p>// 加裁自定义词典<br />DictionaryUtils.loadCustomDictionary();</p>
		<p>ApplicationContext context = IOC.getContext();</p>
		<p>Compass compass = (Compass) context.getBean("compass");</p>
		<p>CompassTemplate template = new CompassTemplate(compass);</p>
		<p>template.execute(new CompassCallbackWithoutResult() {<br />  protected void doInCompassWithoutResult(CompassSession session)<br />  throws CompassException {<br />  CompassHits hits = session.find("大头人");</p>
		<p>  System.out.println("Found [" + hits.getLength()<br />    + "] hits for [大头人] query");<br />  System.out<br />    .println("======================================================");<br />  for (int i = 0; i &lt; hits.getLength(); i++) {<br />  print(hits, i);<br />  }</p>
		<p>  hits.close();<br />  }<br />});</p>
		<p>}</p>
		<p>public static void print(CompassHits hits, int hitNumber) {<br />Object value = hits.data(hitNumber);<br />Resource resource = hits.resource(hitNumber);<br />System.out.println("ALIAS [" + resource.getAlias() + "] SCORE ["<br />  + hits.score(hitNumber) + "]");<br />System.out.println(":::: " + value);<br />System.out.println("");<br />}<br />}</p>
		<p>
				<br />[Copy to clipboard]</p>
		<p>
				<br />19. 工具类DictionaryUtils是用来管理我们自己采用的中文分词算法的加载自定义词典的。</p>
		<p>CODE:</p>
		<p>/**<br />* Copyright (c) 2005-2006 重庆人月科技发展有限公司<br />* <br />* ------------------------------------------------------------------------------<br />* @(#) DictionaryUtils.java, 2006-8-2 下午04:55:22<br />* ------------------------------------------------------------------------------<br />*/<br />package com.darkhe.sample.mycompass;</p>
		<p>import java.io.File;<br />import java.io.FileNotFoundException;<br />import java.io.FileReader;</p>
		<p>import jeasy.analysis.MMAnalyzer;</p>
		<p>/**<br />* <br />* @author darkhe<br />* @version 1.0.0<br />*/<br />public class DictionaryUtils {<br />// 静态变量<br />private static boolean isInit = false;</p>
		<p>// 静态初始化</p>
		<p>// 静态方法<br />public static void loadCustomDictionary() throws FileNotFoundException {</p>
		<p>if (isInit == false) {</p>
		<p>  // 添加我们自己的词典<br />  FileReader fr = new FileReader(new File("dict.txt"));<br />  MMAnalyzer.addDictionary(fr);<br />  <br />  //System.out.println("添加我们自己的词典");</p>
		<p>  isInit = true;<br />}<br />}<br />}</p>
		<p>[Copy to clipboard]</p>
		<p>20. 执行Indexer，再执行Seracher后控制台信息如下：</p>
		<p>Found [1] hits for [大头人] query<br />================================================<br />ALIAS [Article] SCORE [0.3988277]<br />:::: <a href="mailto:com.darkhe.sample.mycompass.Article@bla4e2">com.darkhe.sample.mycompass.Article@bla4e2</a></p>
		<p>
				<br />具体结果和你的数据表中的内容有别。</p>
		<p>21. 这样，我们便实现了如何利用compass构建我们自己的搜索引擎的一个简单实现。</p>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/98072.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2007-02-05 17:27 <a href="http://www.blogjava.net/liuwentao253/archive/2007/02/05/98072.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>