Solr继续
Solr 5.0之后就不再以.war包的格式发布了。而是以一个单独的linux进程发布(daemon)。在其目录下面可以找到init.d目录中的solr,通过该脚本可以启动/opt/solr目录下面的solr工具。但是之后的Solr可能还能够部署到容器当中,但是不是官方所支持的了。
是这样配置的,首先将Solr的tgz后下载之后解压到一个文件夹当中。然后将bin/init.d中的solr文件复制到/etc/init.d目录之下,并需要修改里面的脚本文件。特别是其中的SOLR_INSTALL_DIR变量。然后将solr.in.sh脚本复制到/etc/default目录之下。注意设置RUNAS="root"变量的值,以及SOLR_ENV的值。设置好之后应该就可以通过service solr start启动服务了。这个时候可以通过netstat命令看到7983端口与8983端口已经被监听了。然后打开localhost:8983也可以进入Solr的管理界面。
快速开始教程参考http://lucene.apache.org/solr/quickstart.html。Lucene/Solr的架构见http://www.solr.cc/blog/?p=167。
要使用快速开始,就不能够使用linux daemon的方式直接启动Solr,必须能够加载example里面的collection名称(core名称)。启动的时候,命令改成bin/solr start -e cloud -noprompt,其中的-e选项后面跟例子名称,比如cloud。在这种方式之下启动,我们可以看到管理台界面的各个collection了。然后就可以使用post工具提交待索引的文档(XML、JSON等格式了)。http://blog.csdn.net/near1024/article/details/44105935上面列出了PDF、CSV、XML、JSON、PPT等格式。
之后我们登录控制台,在控制台当中找到getting started的collection,在collection里面选择query,查询一个词,比如2006,在右边就可以返回结果了。https://lucene.apache.org/solr/quickstart.html上面的教程我们可以完全参考,以尝试如何进行POST,QUERY等操作。里面还介绍了如何通过HTTP来进行查询与得到查询结果。还可以找到Solr的各种高级搜索的表达式。详细参考Solr Reference Guide。Solr的集群,则应该参考Admin Guide。
Solr的slorconfig.xml
solrconfig.xml文件用于控制许多影响Solr的行为的参数。配置Solr的时候,许多时候是在同solrconfig.xml文件打交道。或者我们可以通过Config API来间接地修改solrconfig.xml中的值。
solrconfig.xml的功能包括但不限于:
- request handlers,处理API与响应
- listeners,监听特定的查询事件,用于触发特定代码的执行
- Request Dispatcher,管理HTTP通信
- Admin Web Interface
- 关于复制与副本的问题(详见
Legacy Scaling and Distribution)
solrconfig.xml文件位于每个collection(收藏)的conf/目录之下。典型的例子是server/solr/configsets目录中的配置,它适合于很多的场合。
Solr的官方文档对于solrconfig.xml的介绍见https://cwiki.apache.org/confluence/display/solr/Configuring+solrconfig.xml。
Solr中的core(核心)指的是一个单独的索引,以及相关的事务日志与配置文件(solrconfig.xml与Schema文件等)构成的整体。一个Solr在工作的时候可以与多个核心相关联。
通过bin/solr脚本可或者一些API可以创建核心。与核心相关的属性,包括索引文件的存储目录、配置文件、核心的名称等,可以在core.properties文件中得到定义。任何core.properties可以在机器当中的任何位置,因为Solr将会在solr_home下面查找相关的文件。在Solr的单机模式(standalone)下,solr.xml文件必须放在solr_home目录之下,在SolrCloud模式下,solr.xml可以从ZooKeeper当中加载。ZooKeeper当中找不到的时候返回solr_home当中。在旧版本的Solr当中,cores必须被定义在solr.xml文件中的<cores>里面,但是现在Solr支持从solr.xml配置文档中自动发现cores。这样可以动态地创建cores与collections。
我们可以参考server/solr/solr.xml文件。
在建立Solr的集群的时候,不同的机器上的核心具有不同的名称,比如所谓的replica1、replica2、replica3核心。有多个核心可以共同组成一个集群。由于访问Solr的时候必须显式指定core的名称,所以,三台机器配置相同域名的时候,不能使用Nginx做负载均衡。这个时候,要通过Solrj提供的SolrCloudClient,通过ZooKeeper地址进行访问。
Solr连接的时候存在许多的问题,比如SolrClient首次连接ZooKeeper的时候会出现超时。另外Solr原生对中文的支持较差,只能单个分词,因此我们可能需要使用其它的分词器比如ICUTokenizer替代Solr默认的Tokenizer。另外,如果Solr的日志量太大的话,可以使用CONSOLE设置日志级别为WARN,或者控制单个日志文件的大小。
Solr的集群恢复,最坏的情况下需要二倍于当前core的存储空间。此外,默认可能Solr在多核的情况下只能使用一个CPU。此外,我们还可以看到GC吞吐量过低(只有85%这样的级别),这个时候可以设置HEAP大小,使之达到98%这样的级别。还有Out of Memory等问题,见http://www.cnblogs.com/davidwang456/p/5241429.html。详细内容,要学习http://iamyida.iteye.com/category/338597。后者也介绍了Jetty、Tomcat等容器的配置。
http://iamyida.iteye.com/category/338597里面介绍,创建collection的方式是这样的,先决条件是我们在server/solr目录下面有一个solr.xml文件,以后我们就把server/solr目录简称为solr目录了。之后我们创建一个collection1这样的文件夹,进一步在文件夹里面创建一个conf文件夹。进一步地,将server/solr/configsets/basic_configs/conf/solrconfig.xml文件复制到server/solr/collection1/conf目录下面。
然后在Solr的管理控制台中选择添加core,里面指定名称,solr的路径,dataDir、config、schema.xml等文件。自己遇到的一个问题是:
Error CREATEing SolrCore 'collection1': Unable to create core [collection1] Caused by: Unknown parameters: {enablePositionIncrements=true}
浏览器的方式创建core,形如
http://localhost:8080/solr/admin/cores?action=CREATE&name=core2&instanceDir=/opt/solr/core2&config=solrconfig.xml&schema=schema.xml&dataDir=data
- name:就是你的core名称,
- instanceDir就是你的core根目录,举个例子,linux下可能是/opt/solr/core2,windows下可能是C:/solr/core2
- config,schema即core的两个重要的配置文件的名称,只要你core目录结构按规范创建好了,就会按照你指定的配置文件名称去conf目录下去找,dataDir表示你的core的数据目录,该用户主要用来存放你当前core的索引数据。创建好之后就可以post了。
一种不用自己配的方法是利用examples里面的collection1,将其内容复制到solr的目录里面,但是这种方法其实也不好。
注意Java当中很多地方显示的是错误的信息,比如表面上是因为解析不了enablePositionIncrements属性的问题,但是事实上,我们要看ThreadDump里面的详细的错误信息才行(Java的错误的可读性,感觉非常差,Bug也非常多)。
最后,自己决定查看solr的reference manual。http://mirrors.cnnic.cn/apache/lucene/solr/ref-guide/apache-solr-ref-guide-6.0.pdf。
为了方便用户往solr中添加索引,Solr为用户提供了一个post.jar工具,用户只需要在命令行下运行post.jar并传入一些参数就可以完成索引的增删改操作,对,它仅仅是一个供用户进行Solr测试的工具而已。