最近看研究了一下搜索引擎(COMPASS),學到的東西不多,但還是把所學的東西在這里記錄一下,本人用的是COMPASS1.2
下載地址:https://compass.dev.java.net/files/documents/4669/71790/compass-1.2-with-dependencies.zip
本人用的是里面帶的一個例子(petclinic),主要的配置文件有:petclinic-servlet.xml,applicationContext-hibernate.xml,petclinic-cpm.xml,petclinic-cmd.xml,petclinic-hbm.xml,compass.cfg.xml(查找資料后,為了用paoding中文分詞而加上)。
注:配置文件中的注釋都是網上資料或本人對其的理解,如果有誤還請指教,以免誤導學習者。
petclinic-servlet.xml:
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
3 <beans>
4 <!-- ========================= 消息來源定義 ========================= -->
5 <!-- 加載"/WEB-INF/classes"目錄下messages*.properties文件 -->
6 <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
7 <property name="basename"><value>messages</value></property>
8 </bean>
9
10 <!-- ========================= 映射定義 ============================= -->
11 <!-- 加載"/WEB-INF/classes"目錄下views.properties文件 -->
12 <bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
13 <property name="basename"><value>views</value></property>
14 </bean>
15 <!-- 定義異常處理VIEW -->
16 <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
17 <property name="exceptionMappings">
18 <props>
19 <prop key="org.compass.core.CompassException">dataAccessFailure</prop>
20 <prop key="org.springframework.dao.DataAccessException">dataAccessFailure</prop>
21 <prop key="org.springframework.transaction.TransactionException">dataAccessFailure</prop>
22 </props>
23 </property>
24 </bean>
25 <!-- 定義url映射 -->
26 <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
27 <property name="mappings">
28 <props>
29 <prop key="/welcome.htm">clinicController</prop>
30 <prop key="/tutorial.htm">clinicController</prop>
31 <prop key="/spring-tutorial.htm">clinicController</prop>
32 <prop key="/vets.htm">clinicController</prop>
33 <prop key="/findOwners.htm">findOwnersForm</prop>
34 <prop key="/owner.htm">clinicController</prop>
35 <prop key="/addOwner.htm">addOwnerForm</prop>
36 <prop key="/editOwner.htm">editOwnerForm</prop>
37 <prop key="/addPet.htm">addPetForm</prop>
38 <prop key="/editPet.htm">editPetForm</prop>
39 <prop key="/addVisit.htm">addVisitForm</prop>
40 <prop key="/search.htm">searchController</prop>
41 <prop key="/index.htm">indexController</prop>
42 </props>
43 </property>
44 </bean>
45
46
47 <!-- ========================= 控制器定義 ========================= -->
48 <bean id="compassSearchHelper" class="org.compass.sample.petclinic.CompassSearchHelper">
49 <property name="highlightFields">
50 <list>
51 <value>description</value>
52 </list>
53 </property>
54 <property name="pageSize"><value>10</value></property>
55 <constructor-arg ref="compass"/>
56 </bean>
57 <!-- 搜索控制器定義 -->
58 <bean id="searchController" class="org.compass.spring.web.mvc.CompassSearchController">
59 <property name="compass"><ref bean="compass"/></property>
60 <property name="searchView"><value>searchView</value></property>
61 <property name="searchResultsView"><value>searchResultsView</value></property>
62 <property name="pageSize"><value>10</value></property>
63 <property name="searchHelper"><ref local="advanceCompassSearchHelper"/></property>
64 </bean>
65 <!-- 索引控制器定義 -->
66 <bean id="indexController" class="org.compass.spring.web.mvc.CompassIndexController">
67 <property name="compassGps"><ref bean="compassGps"/></property>
68 <property name="indexView"><value>indexView</value></property>
69 <property name="indexResultsView"><value>indexResultsView</value></property>
70 </bean>
71
72 <!-- 定義clinic控制器 -->
73 <bean id="clinicController" class="org.compass.sample.petclinic.web.ClinicController">
74 <property name="methodNameResolver"><ref local="clinicControllerResolver"/></property>
75 <property name="clinic"><ref bean="clinic"/></property>
76 </bean>
77
78 <!-- -->
79 <bean id="clinicControllerResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
80 <property name="mappings">
81 <props>
82 <prop key="/welcome.htm">welcomeHandler</prop>
83 <prop key="/tutorial.htm">tutorialHandler</prop>
84 <prop key="/spring-tutorial.htm">springTutorialHandler</prop>
85 <prop key="/vets.htm">vetsHandler</prop>
86 <prop key="/owner.htm">ownerHandler</prop>
87 </props>
88 </property>
89 </bean>
90 <!-- 定義FORM -->
91 <bean id="findOwnersForm" class="org.compass.sample.petclinic.web.FindOwnersForm">
92 <property name="formView"><value>findOwnersForm</value></property>
93 <property name="selectView"><value>selectOwnerView</value></property>
94 <property name="successView"><value>ownerRedirect</value></property>
95 <property name="clinic"><ref bean="clinic"/></property>
96 </bean>
97 <!-- 定義FORM -->
98 <bean id="addOwnerForm" class="org.compass.sample.petclinic.web.AddOwnerForm">
99 <property name="formView"><value>ownerForm</value></property>
100 <property name="successView"><value>ownerRedirect</value></property>
101 <property name="validator"><ref local="ownerValidator"/></property>
102 <property name="clinic"><ref bean="clinic"/></property>
103 </bean>
104 <bean id="editOwnerForm" class="org.compass.sample.petclinic.web.EditOwnerForm">
105 <property name="formView"><value>ownerForm</value></property>
106 <property name="successView"><value>ownerRedirect</value></property>
107 <property name="validator"><ref local="ownerValidator"/></property>
108 <property name="clinic"><ref bean="clinic"/></property>
109 </bean>
110 <bean id="ownerValidator" class="org.compass.sample.petclinic.validation.OwnerValidator"/>
111 <bean id="addPetForm" class="org.compass.sample.petclinic.web.AddPetForm">
112 <property name="formView"><value>petForm</value></property>
113 <property name="successView"><value>ownerRedirect</value></property>
114 <property name="validator"><ref local="petValidator"/></property>
115 <property name="clinic"><ref bean="clinic"/></property>
116 </bean>
117 <bean id="editPetForm" class="org.compass.sample.petclinic.web.EditPetForm">
118 <property name="formView"><value>petForm</value></property>
119 <property name="successView"><value>ownerRedirect</value></property>
120 <property name="validator"><ref local="petValidator"/></property>
121 <property name="clinic"><ref bean="clinic"/></property>
122 </bean>
123 <bean id="petValidator" class="org.compass.sample.petclinic.validation.PetValidator"/>
124 <!-- 定義FORM,用了visitValidatro和clinic屬性 -->
125 <bean id="addVisitForm" class="org.compass.sample.petclinic.web.AddVisitForm">
126 <property name="formView"><value>visitForm</value></property>
127 <property name="successView"><value>ownerRedirect</value></property>
128 <property name="validator"><ref local="visitValidator"/></property>
129 <property name="clinic"><ref bean="clinic"/></property>
130 </bean>
131 <!-- 定義bean屬性 -->
132 <bean id="visitValidator" class="org.compass.sample.petclinic.validation.VisitValidator"/>
133 </beans>
applicationContext-hibernate.xml:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
3 <beans>
4 <!-- ========================= JDBC資源文件定義 ========================= -->
5 <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
6 <property name="location"><value>/WEB-INF/jdbc.properties</value></property>
7 </bean>
8 <!-- 定義數據源 -->
9 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
10 <property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
11 <property name="url"><value>${jdbc.url}</value></property>
12 <property name="username"><value>${jdbc.username}</value></property>
13 <property name="password"><value>${jdbc.password}</value></property>
14 </bean>
15 <!-- 定義Hibernate的SessionFactory -->
16 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
17 <property name="dataSource"><ref local="dataSource"/></property>
18 <property name="mappingResources">
19 <value>petclinic.hbm.xml</value>
20 </property>
21 <property name="hibernateProperties">
22 <props>
23 <prop key="hibernate.dialect">${hibernate.dialect}</prop>
24 <prop key="hibernate.show_sql">true</prop>
25 <prop key="hibernate.generate_statistics">true</prop>
26 </props>
27 </property>
28 <property name="eventListeners">
29 <map>
30 <entry key="merge">
31 <bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener"/>
32 </entry>
33 </map>
34 </property>
35 </bean>
36 <!-- COMPASS相關配置 -->
37 <bean id="compass" class="org.compass.spring.LocalCompassBean">
38 <property name="resourceLocations">
39 <list>
40 <!-- 這里是compass所需要的兩個關于數據項的配置文件 -->
41 <value>classpath:org/compass/sample/petclinic/petclinic.cmd.xml</value>
42 <value>classpath:petclinic.cpm.xml</value>
43 </list>
44 </property>
45 <property name="configLocation">
46 <value>classpath:compass.cfg.xml</value>
47 </property>
48 <property name="compassSettings">
49 <props>
50 <!-- 索引文件在服務器上的存儲路徑 -->
51 <!-- 加亮顯示 -->
52 <prop key="compass.engine.highlighter.default.formatter.simple.pre">
53 <![CDATA[<font color="red"><b>]]>
54 </prop>
55 <prop key="compass.engine.highlighter.default.formatter.simple.post">
56 <![CDATA[</b></font>]]>
57 </prop>
58 </props>
59 </property>
60 <property name="transactionManager">
61 <ref local="transactionManager" />
62 </property>
63 </bean>
64
65 <bean id="queryAnalyzer" class="net.paoding.analysis.analyzer.PaodingAnalyzer">
66 </bean>
67
68
69 <!-- 與hibernate的綁定,用Hibernate3事件系統,支持Real Time Data Mirroring.經Hiberante的數據改變會自動被反射到索引里面 -->
70 <!--<bean id="hibernateGpsDevice" class="org.compass.spring.device.hibernate.dep.SpringHibernate3GpsDevice">-->
71 <bean id="hibernateGpsDevice" class="org.compass.gps.device.hibernate.HibernateGpsDevice">
72 <property name="name"><value>hibernateDevice</value></property>
73 <property name="sessionFactory"><ref local="sessionFactory" /></property>
74 <property name="nativeExtractor"><bean class="org.compass.spring.device.hibernate.SpringNativeHibernateExtractor" /></property>
75 </bean>
76 <!-- Compass中建立索引與mirror database change的部件,定義了init-method 和destory-method,
77 會自動隨ApplicaitonContext的啟動,開始監控Hibernate的變化,經Hiberante的數據改變會自動被反射到索引里面 -->
78 <bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps" init-method="start" destroy-method="stop">
79 <property name="compass"><ref bean="compass" /></property>
80 <property name="gpsDevices">
81 <list>
82 <bean class="org.compass.spring.device.SpringSyncTransactionGpsDeviceWrapper">
83 <property name="gpsDevice" ref="hibernateGpsDevice" />
84 </bean>
85 </list>
86 </property>
87 </bean>
88 <!-- 定義事務處理交于hibernate3 -->
89 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
90 <property name="sessionFactory"><ref local="sessionFactory"/></property>
91 </bean>
92
93 <!-- ========================= 業務對象相關定義 ========================= -->
94 <bean id="clinicTarget" class="org.compass.sample.petclinic.hibernate.HibernateClinic">
95 <property name="sessionFactory"><ref local="sessionFactory"/></property>
96 </bean>
97 <!-- 定義攔截器 -->
98 <bean id="clinic" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
99 <property name="transactionManager"><ref local="transactionManager"/></property>
100 <property name="target"><ref local="clinicTarget"/></property>
101 <property name="transactionAttributes">
102 <props>
103 <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
104 <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
105 <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
106 <prop key="store*">PROPAGATION_REQUIRED</prop>
107 </props>
108 </property>
109 </bean>
110 </beans>
compass.cfg.xml:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <compass-core-config
3 xmlns="http://www.opensymphony.com/compass/schema/core-config"
4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 xsi:schemaLocation="http://www.opensymphony.com/compass/schema/core-config
6 http://www.opensymphony.com/compass/schema/compass-core-config.xsd">
7
8 <compass name="default">
9 <connection>
10 <file path="/${user.home}/compass" /> <!-- 這里是索引文件的存放路徑 -->
11 </connection>
12
13 <searchEngine>
14 <!-- 因是使用自己的分詞算法,所以這里的類型必須是CustomAnalyzer -->
15 <analyzer name="paodingAnalyer" type="CustomAnalyzer" analyzerClass="net.paoding.analysis.analyzer.PaodingAnalyzer">
16 <stopWords>
17 <stopWord value="test" />
18 </stopWords>
19 </analyzer>
20 </searchEngine>
21
22 </compass>
23 </compass-core-config>
petclinic-cpm.xml(列出部分):
1 <?xml version="1.0"?>
2 <!DOCTYPE compass-core-mapping PUBLIC
3 "-//Compass/Compass Core Mapping DTD 1.0//EN"
4 "http://www.opensymphony.com/compass/dtd/compass-core-mapping.dtd">
5
6 <!-- 這里的包名必須和pojo的包名一致 -->
7 <compass-core-mapping package="org.compass.sample.petclinic">
8
9 <!-- 定義實體及其字段的對應關系 -->
10
11 <!-- 注意實體及其字段的名稱的大小寫應當與pojo對象一致,而不是與數據庫一致
12 關于pojo與數據庫的對應表的一致性關系由hibernate的映謝文件定義,而不是這個文件
13 當前映射文件只定義compass與hibernate的關系 -->
14 <contract alias="entity">
15 <id name="id" />
16 </contract>
17
18 <contract alias="named-entity" extends="entity">
19 <property name="name">
20 <meta-data>${petclinic.name}</meta-data>
21 </property>
22 </contract>
23
24 <contract alias="person" extends="entity">
25 <property name="firstName">
26 <meta-data>${petclinic.firstName}</meta-data>
27 </property>
28
29 <property name="lastName">
30 <meta-data>${petclinic.lastName}</meta-data>
31 </property>
32
33 <property name="address">
34 <meta-data>${petclinic.address}</meta-data>
35 </property>
36
37 <property name="city">
38 <meta-data>${petclinic.city}</meta-data>
39 </property>
40
41 <property name="telephone">
42 <meta-data>${petclinic.telephone}</meta-data>
43 </property>
44 </contract>
45
petclinic-cmd.xml(列出部分):
1 <?xml version="1.0"?>
2 <!DOCTYPE compass-core-meta-data PUBLIC
3 "-//Compass/Compass Core Meta Data DTD 1.0//EN"
4 "http://www.opensymphony.com/compass/dtd/compass-core-meta-data.dtd">
5
6 <compass-core-meta-data>
7
8 <!-- 定義一個實體和字段組-->
9 <meta-data-group id="petclinic" displayName="Petclinic Meta Data">
10
11 <description>Petclinic Meta Data</description>
12 <uri>http://compass/sample/petclinic</uri>
13
14 <!-- 申明所有需要檢索的實體-->
15 <alias id="vet" displayName="Vet">
16 <description>Vet alias</description>
17 <uri>http://compass/sample/petclinic/alias/vet</uri>
18 <name>vet</name>
19 </alias>
20
21 <alias id="pet" displayName="Pet">
22 <description>Pet alias</description>
23 <uri>http://compass/sample/petclinic/alias/pet</uri>
24 <name>pet</name>
25 </alias>
26
27 <alias id="owner" displayName="Owner">
28 <description>Owner alias</description>
29 <uri>http://compass/sample/petclinic/alias/owner</uri>
30 <name>owner</name>
31 </alias>
32
33 <alias id="visit" displayName="Visit">
34 <description>Visit alias</description>
35 <uri>http://compass/sample/petclinic/alias/visit</uri>
36 <name>visit</name>
37 </alias>
38
39 <alias id="specialty" displayName="Specialty">
40 <description>Specialty alias</description>
41 <uri>http://compass/sample/petclinic/alias/specialty</uri>
42 <name>specialty</name>
43 </alias>
44
45 <alias id="petType" displayName="Pet Type">
46 <description>Pet Type alias</description>
47 <uri>http://compass/sample/petclinic/alias/petType</uri>
48 <name>petType</name>
49 </alias>
50
51 <!-- 申明所有需要檢索的屬性或者字段,而不管這些屬性或者字段是哪個實體的 -->
52 <meta-data id="type" displayName="Type">
53 <description>Type of an entity in the system</description>
54 <uri>http://compass/sample/petclinic/type</uri>
55 <name>type</name>
56 <value id="mdPerson">person</value>
57 </meta-data>
58
59 <meta-data id="name" displayName="Name">
60 <description>The name of an entity</description>
61 <uri>http://compass/sample/petclinic/name</uri>
62 <name>name</name>
63 </meta-data>
petclinic-hbm.xml就不做介紹,普通的hibernate配置文件。
接下來是一個問題也是本人筆記的原因,
在本人上一篇隨筆(
http://www.tkk7.com/szhswl/archive/2007/12/18/168437.html)寫到查詢時的注意問題,用"tes*"做為查詢條件時是前綴查詢,lucene里QueryParser類實例了PrefixQuery類,在compass1.2源代碼里org.compass.core.lucene.engine.queryparser.CompassQueryParser類繼承了并且重寫了QueryParser類里的getPrefixQuery方法,方法源代碼如下:
1 protected Query getPrefixQuery(String field, String termStr) throws ParseException {
2 if (getLowercaseExpandedTerms()) {
3 termStr = termStr.toLowerCase();
4 }
5
6 Term t = new Term(field, termStr);
7 return new ConstantScorePrefixQuery(t);\
8 }
也就是說用"tes*"查詢時在compass1.2里實例了ConstantScorePrefixQuery,compass1.2用的是lucene2.2,本人查看了lucene2.2里源代碼,ConstantScorePrefixQuery類里實現高亮時用到的一個重要方法源代碼如下:
1 public void extractTerms(Set terms) {
2 // OK to not add any terms when used for MultiSearcher,
3 // but may not be OK for highlighting
4 }
方法里說得很清楚,根本就沒有實現,所以用compass1.2的petclinic例子時,用"tes*"查詢時,查詢結果沒錯,但頁面${hit.highlightedText['highlightfield']}
高亮顯示出現問題,然后本人把org.compass.core.lucene.engine.queryparser.CompassQueryParser類里getPrefixQuery方法注釋,高亮顯示居然正常了,但這還是修改了compass1.2里的源代碼,應該不是最佳解決方案,如果有達人知道還請指教。
轉載請注明出處。
---------------------------------------------------------------------------------------------------------------------------------
說人之短,乃護己之短??浼褐L,乃忌人之長。皆由存心不厚,識量太狹耳。能去此弊,可以進德,可以遠怨。
http://www.tkk7.com/szhswl
------------------------------------------------------------------------------------------------------ ----------------- ---------
posted on 2007-12-23 13:25
宋針還 閱讀(3059)
評論(4) 編輯 收藏