月度归档:2011年09月

建立多个solr应用

通过观察本博客的其他文章,应该已经会做出一个简单的基于solr的搜索引擎了。但是,现实中,我们往往一个java服务器会服务于多个搜索的应用。

这个时候,我们应该怎么做呀?

也许你会说,solr的schema.xml中多配置一些字段,然后靠其中的一个type字段来区分不就可以了。这样当然是一种方法。但是,如果你是一个网站的所有者,你想你的数据的索引和其他网站的索引放到一起么?答案是否定的。这个时候我们就要思考一下了?

仔细观察就会发现,一个solr的服务主要由两个部分组成,一个对外的web入口,然后一个solr home,而这两者之间的关联,我们已经靠web.xml来实现了。并且用的是绝对路径。这也就意味着,我们的solr home可以写到服务器的任意位置。当然有个前提条件该目录下的data目录可写,因为要往里边写索引文件。再看前边的web入口,实际上他就是一个servlet应用,我们可以基于端口,或者基于application来实现将其分离开。分析完这些问题,我们应该就有解决方案了。

目前有两种基于端口,和基于应用程序。

我们可以让tomcat多监听几个端口,每个端口下放一个solr对外的入口。然后其中配置solr home到两个不同的目录。但是这样也许会有一个问题,也是作者目前遇到的问题。现实中一台服务器中运行着apache和tomcat。apache的端口已经够让人头疼了,还是不要让tomcat来掺火了。

所以我们选择第二种方案。

基于前几篇文章的配置方法。

将/var/lib/tomcat6/下的solr(前几篇文章已经提到如何实现),复制一下,比如说名字是test。

将其中目录下的conf下的solrconfig.xml中的${solr.data.dir:./solr/data},这一行换成
${solr.data.dir:./test/data}

然后将/var/lib/tomcat6/webapps/solr.war,复制一份,比如说名字是test.war。

然后,cd 到test中将其中的web.xml中的solr home 配置到/var/lib/tomcat6/test/

然后重新启动一下tomcat,访问一下http://127.0.0.1:8080/test/就出现一个一模一样的管理界面了。

消逝的声音

我是一个歌者,至少曾经是,或者现在我认为我仍然是一个歌者。

我曾经问过别人这么一个问题。如果我说我的性格就像鹰一样,过分么?他说不过分,而且更确切的说,你的性格就像一只疯了的鹰一样。呵呵。这就是我吧!一个寂寞歌者。

夜深了,突然间感觉这种声音很陌生。感觉这个时候的自己好陌生,也似乎忘记了,究竟自己这段时间在忙些什么吧?有点反感现在的自己,有点反感自己现在做的事情。似乎都市的声音太复杂,让我找不到了当初的我的声音。我变了,变得不知所措!

我,当初的我去了哪里?总是没有一点儿成就感。在水手中有这么一句,总是要靠一点儿酒精的麻醉才能够睡去。我应该靠什么睡去,是疲惫?还是什么?睡梦中还会有你自己么?也许现在你自己的梦都被剥夺了吧!你想要的声音在哪里呢?我真的只想要属于我自己的声音。

我想我还可以唱一些东西来证明一下我自己吧!

否则,也许,我会……

我也害怕我会这样堕落下去,进而找不到那种神秘的声音。

我想我还是可以唱歌的,不管有没有人听吧!

SERVLET基础

谈到无所不能强悍的JAVAEE就不能提到以上的这个名字,这个名词可以说是JAVA WEB编程的基础。不管你用的什么框架,什么技术,都离不开以上的这个东西。因为,JSP本身会被编译成为SERVLET来运行的。

如果这个问题你明白了,那么后边的JSP基本上就不用看了。一个SERVLET本身就是一个类,他直接或者间接的实现了SERVLET接口。有点儿晕了吧!没关系,第一个SERVLET是我们平时说的SERVLET,他是我们最终要实现的东西。而第二个SERVLET是一个JAVAEE中定义的一个接口。所有的SERVLET类都必须实现相应的方法。当然也是像tomcat这样的SERVLET容器,执行程序的过程。同时也是javaee的本质。说了这么多,我们先来看一下这个东西的接口吧!其中包含了这么几种方法:init(SERVLET初始化资源用的),service(本质方法,接受用户的请求用的,没有他SERVLET就没有用了),destroy(最后执行的销毁方法),getServletConfig(获得本身的配置信息),getServletInfo(获得本身的作者信息)。这几个方法的执行顺序是这样的。首先,SERVLET容器运行,然后运行SERVLET的init过程,在内存中生成一个对象。然后不断的相应service方法。最终伴随这SERVLET容器的关闭,而调用SERVLET的destroy方法,将自己在内存中开辟的一些空间释放掉。没错,你没有看错,自始至终存在的都只是一个SERVLET对象。当然一个SERVLET类对应了一个SERVLET对象,只是不断的相应service方法。

但是往往我们不会直接的实现SERVLET接口因为javaee开发包已经帮我们组好了一些工作,有两个类:GenericServlet(一个抽象类),HttpServlet(我们用的最多的一个类)。 继续阅读