论坛首页 入门技术论坛

谈谈compass和sorl 的比较

浏览 13375 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-01-03   最后修改:2009-01-03
想请各位大牛谈谈compass和solr的比较?
不要说compass支持索引事务处理这么简单的东西。想了解一下compass和sorl掌握的难度,
现在企业的应用的情况以及大家一般都是用什么东西来做搜索引擎的,compass or solr or lucnene?

前些天时间自己用compass 搞了个搜索的东西,那个真不好用,例子非常少。。目前为止还有很多没搞定

刚才看了下solr 文档那个感觉比compass详细多了,等下看看他的例子,compass的例子 跑不起来。

如果用纯lucene的话,我怎么感觉比用这么些个框架还要好实现,最起码网上的资料非常多。
虽然用纯lucene写起来代码比较繁琐,最起码遇到问题的时候还有个参考,可以找找,compass..? 没找到

大家说说自己的意见看看。
   发表时间:2009-01-03  
见意使用hibernate search
0 请登录后投票
   发表时间:2009-01-03  
见意使用hibernate search
0 请登录后投票
   发表时间:2009-01-03  
Hibernate的search 是采用lucene写的还是什么?
0 请登录后投票
   发表时间:2009-01-04  
Hibernate Search也是对Lucene的一个封装,我几年前使用Lucene做过一个项目,也不是很麻烦,Compass之类的框架也只是一个封装,至少你不用做很多重复性的劳动。
0 请登录后投票
   发表时间:2009-01-04  
恩,那到时,纯lucene 确实比较繁琐,而compass封装好了,不过它的API可能由于是能力有限,所以不大会用
solr 呢?谁用过,说说意见啊

我喜欢lucene技术,也不知道是为什么喜欢 ?所以想来问问
0 请登录后投票
   发表时间:2009-01-14  
solr 可以比较快速的建立一个应用. 因为 lucene 的文档结构是可配置的.

compass 不太了解, 它也可以配置吧
0 请登录后投票
   发表时间:2009-01-14   最后修改:2009-01-14
建议使用solr,其中的分组统计功能特别好使,例子也多,只是稍稍部署有点烦。Compass与Hibernate Search个人感觉差不多,两者与Hibernate集成都不用写什么代码,Compass还支持好几种持久框架集成,Hibernate Search好像只支持Hibernate。想diy,就直接用Lucene。
0 请登录后投票
   发表时间:2009-02-02  
如果是使用ssh框架建议用compass,compass封装的比较好,只是有个问题就是中文资料比较少,而且 不全。。
0 请登录后投票
   发表时间:2009-02-13  
其实compass只是简单的应用的话,也很容易上手的
假如使用了hibernate+spring+compass
关于compass在spring中的配置如下,保存为一个xml文件,在web.xml中引入即可
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
	<bean id="annotationConfiguration" class="org.compass.annotations.config.CompassAnnotationsConfiguration"></bean>

	<bean id="compass" class="org.compass.spring.LocalCompassBean">
		<!-- 这里的配置意思是指需要搜索的POJO对象 -->
		<property name="classMappings">
			<list>
				<value>com.tourye.model.TnInfomation</value>
			</list>
		</property>
                <!-- 这里的配置意思是指使用annotation进行compass配置 -->
		<property name="compassConfiguration" ref="annotationConfiguration" />
		<property name="compassSettings">
			<props>
				<prop key="compass.engine.connection">/home/dev/compass</prop>这里说明索引文件所放的目录
				<prop key="compass.transaction.factory">org.compass.spring.transaction.SpringSyncTransactionFactory</prop>
				<!-- <prop key="compass.engine.analyzer.default.type">net.paoding.analysis.analyzer.PaodingAnalyzer</prop> -->这里的注释是为了说明使用paoding的分词器,由于测试时,有时会出问题,所以暂时禁用
			</props>
		</property>
		<property name="transactionManager">
			<ref bean="transactionManager" />
		</property>
		<!--
			高亮设置,未测试成功,需要相关的代码辅助 <property name="compass.engine.highlighter.default.formatter.simple.pre"> <value><![CDATA[<font
			color="red"><b>]]></value> </property> <property name="compass.engine.highlighter.default.formatter.simple.post">
			<value><![CDATA[</b></font>]]></value> </property>
		-->
	</bean>
        下面的两段配置是为了说明compass构建索引与hibernate的insert/delete/update操作同步
	<bean id="hibernateGpsDevice" class="org.compass.gps.device.hibernate.HibernateGpsDevice">
		<property name="name">
			<value>hibernateDevice</value>
		</property>
		<property name="sessionFactory">
			<ref bean="mySessionFactory" />
		</property>
		<property name="nativeExtractor">
			<bean class="org.compass.spring.device.hibernate.SpringNativeHibernateExtractor" />
		</property>
	</bean>

	<bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps" init-method="start" destroy-method="stop">
		<property name="compass">
			<ref bean="compass" />
		</property>
		<property name="gpsDevices">
			<list>
				<bean class="org.compass.spring.device.SpringSyncTransactionGpsDeviceWrapper">
					<property name="gpsDevice" ref="hibernateGpsDevice" />
				</bean>
			</list>
		</property>
	</bean>

	<!-- 自动随Spring ApplicationContext启动而重建索引,未研究 -->
	<bean id="compassIndexBuilder" class="com.tourye.service.timer.CompassIndexBuilder" lazy-init="false">
		<property name="compassGps" ref="compassGps" />
		<property name="buildIndex" value="true" />
		<property name="lazyTime" value="10" />
	</bean>
</beans>


第二步:
使用annotatio声明要索引的object,如下所示,自己根据需要进行设置
相关文档 参考:http://www.compass-project.org/docs/2.2.0M2/reference/html/core-osem.html#core-osem-searchableclasses
@Searchable
public class TnInfomation implements java.io.Serializable {
    /**
	 * 
	 */
    private static final long serialVersionUID = -4503017770118428686L;
    
    @SearchableId(name = "id")
    private Long              id;
    
    private int               type;
    @SearchableProperty(name="title")
    private String            title;
    @SearchableProperty(name="keywords")
    private String            keywords;
    @SearchableProperty(name="content")
    private String            content;
    private int               author;
    private Date              createtime;
    private Date              updatetime;
    @SearchableProperty(name="approvetime")
    private Date              approvetime;
    private int               clicks;
    private int               critiques;
    private String            provenance;
    @SearchableProperty(name="status")
    private byte              status; /* 待审核(0) 已审核(1)*/


第三步,建立搜索service
public class InfomationSearchServiceImpl implements InfomationSearchService {
    private Compass compass;

    public Compass getCompass() {
        return compass;
    }

    public void setCompass(Compass compass) {
        this.compass = compass;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.tourye.infomation.compass.InfomationSearchService#search(java.lang
     * .String, int, int)
     */
    public CompassSearchResults search(String query, int page, int pageSize) throws Exception {
        CompassSession session = compass.openSession();
        try {
            session.beginTransaction();
            //构建compass查询编辑器
            CompassQueryBuilder querybuilder = session.queryBuilder();
            CompassQuery cq = null;
            CompassSearchCommand csc = null;
            //声明查询条件,query是查询字符串
            if (StringUtils.isNotEmpty(query)) {
                cq = querybuilder.bool().addMust(querybuilder.spanEq("status", 1)).addMust(
                        querybuilder.queryString(query).toQuery()).toQuery();
                cq.addSort("approvetime", CompassQuery.SortDirection.REVERSE);
                csc = new CompassSearchCommand(cq, new Integer(Math.max(0, page - 1)));
            } else {
                csc = new CompassSearchCommand(query.trim());
            }
            // 搜索命令InfomationSearchHelper和CompassSearchHelper相同,自己可以实现
            InfomationSearchHelper searchHelper = new InfomationSearchHelper(compass, pageSize);
            CompassSearchResults searchResults = searchHelper.search(csc);

            return searchResults;
        } finally {
            if (session != null) session.close();
        }
    }
}


这样就可以了
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics