在 tomcat 中运行 solr

基于 solr 进行开发,少不了要在 tomcat 中运行 solr,这里以 windows + tomcat 6.0 + solr 3.5 为基础讲解在 tomcat 中部署 solr 的过程。

首先在 solr 的发行包中 apache-solr-3.5.0\dist 下找到 apache-solr-3.5.0.war,将其复制到 tomcat/webapp 下,启动 tomcat ,tomcat 会将 war 包解压开,然后会报一个错误,说在 tomcat/bin 目录下找不到 solr/home ,现在可以先关闭 tomcat ,找到  apache-solr-3.5.0 文件夹(就是war包被 tomcat 解压出来的),打开 Tomcat 6.0\webapps\apache-solr-3.5.0\WEB-INF 下的 web.xml,将
<env-entry>
       <env-entry-name>solr/home</env-entry-name>
       <env-entry-value>/put/your/solr/home/here</env-entry-value>
       <env-entry-type>java.lang.String</env-entry-type>
    </env-entry>
的注释去掉,将  /put/your/solr/home/here  的值改成 solr 配置文件所在的位置(solr/home),如:D:/apache-solr-3.5.0/example/solr。保存文件再运行 tomcat,正常情况下,此次启动不会报错了,启动完成后,在浏览器中输入

http://localhost:81/apache-solr-3.5.0/admin/

就可以看到 solr 的管理界面了,此时 solr 3.5 在 tomcat 中部署成功了。

至于 solr/home 的配置,除了像本例在配置在 web.xml 中,还可以配置在系统环境变量中(像 java_home 类似的配法),也可以 tomcat 启动命令行中增加

JAVA_OPTS=”-Dsolr.solr.home=/Users/jonathan/Desktop/solr”

阿丁比较推荐的做法是按本例中的方式,配置在 web.xml 中,这样对tomcat、操作系统影响最少,换一个 tomcat 只需将修改自己本身的 web.xml 就行。

solr 客户端 API

截止2011年11月,Solr 已经有以下客户端:

名称 语言 URL
SolRuby Ruby http://wiki.apache.org/solr/SolRuby
DelSolr Ruby http://delsolr.rubyforge.org/
acts_as_solr Rails http://acts-as-solr.rubyforge.org/,http://rubyforge.org/projects/background-solr/
Flare Rails http://wiki.apache.org/solr/Flare
SolPHP PHP http://wiki.apache.org/solr/SolPHP
SolrJ Java http://wiki.apache.org/solr/SolJava
Python API http://wiki.apache.org/solr/SolPython
PySolr Python http://code.google.com/p/pysolr/
SolPerl Perl http://wiki.apache.org/solr/SolPerl
Solr.pm Perl http://search.cpan.org/~garafola/Solr-0.03/lib/Solr.pm
SolrForrest Forrest/Cocoon http://wiki.apache.org/solr/SolrForrest
SolrSharp C# http://www.codeplex.com/solrsharp
SolColdfusion ColdFusion http://solcoldfusion.riaforge.org/
SolrNet .NET http://code.google.com/p/solrnet/
AJAX AJAX http://github.com/evolvingweb/ajax-solr/wiki

lucene 和 Solr 版本对应关系

什么是过滤器

和切词器一样,过滤器也是消费输入,然后输出一串的 tokens,过滤器也是继承自 org.apache.lucene.analysis.TokenStream。和切词器不一样的是,一个过滤器的输入是另一种TokenStream。通常情况下,过滤器的工作比切词器简单,过滤器拿着每个token,决定是继续流转下去或者替换或者抛弃。
过滤器消费一个 TokenStream 然后产生一个新的 TokenStream,过滤器可以一个接一个组成一个链。链上的每个过滤器按顺序执行,因此注明过滤器的顺序显得很重要。通常情况下,先执行普通过滤器,然后执行专业过滤器。
&lt;fieldType name=&quot;text&quot; class=&quot;solr.TextField&quot;&gt;<br />
&lt;analyzer&gt;<br />
&lt;tokenizer class=&quot;solr.StandardTokenizerFactory&quot;/&gt;<br />
&lt;filter class=&quot;solr.StandardFilterFactory&quot;/&gt;<br />
&lt;filter class=&quot;solr.LowerCaseFilterFactory&quot;/&gt;<br />
&lt;filter class=&quot;solr.EnglishPorterFilterFactory&quot;/&gt;<br />
&lt;/analyzer&gt;<br />
&lt;/fieldType&gt;

这个例子以solr标准分词器为开始,这个分词器会将字段的文本拆分成tokens,这些tokens再通过solr标准过滤器,标准过滤器移除字母中的点号,并且执行一些其他通用的操作。然后所有的token被转成小写,这样查询时可以匹配大小写不敏感搜索。
上面例子中最后一个过滤器是一个 stemmer 过滤器,它使用了Porter算法。

日期的处理

DateField 表示一个精确到毫秒的时间,值的格式是:
YYYY-MM-DDThh:mm:ssZ

YYYY 表示年.
MM 表示月.
DD 表示日.
hh 表示24小时制的小时.
mm 表示分钟.
ss 表示秒.

值的注意的是上面的那个时间格式里没有时区;带时区的时间格式可以通过格林尼治时间表示。这里是一个示例的值:
1972-05-20T17:33:18Z

另一个带毫秒的例子:
1972-05-20T17:33:18.772Z

另外,DataField也支持日期计算。这个可以方便创建相对于当前时间的时间点。可以用这个表达从现在往后两个月:
+2MONTHS

这个表示一天以前:
-1DAY

使用/可以表示当前的某部分时间,这个表示当前的小时:
/HOUR

当然也能组合表达式,以下表示的是六个月零三天以后的日(一个月的第几天):
+6MONTHS+3DAYS/DAY

Copyright © All Rights Reserved · Green Hope Theme by Sivan & schiy · Proudly powered by WordPress · 闽ICP备18020075号