最近因项目须要,安装部署solr,这里我记录下学习solr中遇到的问题php
solr教程,网上不少,很泛滥;可是值得参考的很少,下面就整理一下我在学习solr过程当中的资料,一些能直接搜索到的文档,我会列出文章名字和连接。前端
solr下载地址:http://archive.apache.org/dist/lucene/solr/java
Solr部署详解:http://blog.csdn.net/xiaoyu411502/article/details/44835119node
这篇文章所述的场景是部署在tomcat上的,可是说的是linux上的,linux
你还能够看这一篇,看下windows端的:http://blog.csdn.net/caicongyang/article/details/50084273,web
若是想用solr自带的jetty部署的话须要另外注意。apache
下边是用自带的jetty部署solr:json
1,复制solr压缩包到/usr/local下,解压、bootstrap
2,进到 solr-5.3.1/bin目录下vim
3,执行脚本,./install_solr_service.sh /usr/local/solr-5.3.1.zip
[root@localhost bin]# ./install_solr_service.sh /usr/local/solr-5.3.1.zip id: solr: no such user Creating new user: solr Extracting /usr/local/solr-5.3.1.zip to /opt Creating /etc/init.d/solr script ... Waiting up to 30 seconds to see Solr running on port 8983 [/] Started Solr server on port 8983 (pid=4765). Happy searching! Found 1 Solr nodes: Solr process 4765 running on port 8983 { "solr_home":"/var/solr/data/", "version":"5.3.1 1703449 - noble - 2015-09-17 01:48:15", "startTime":"2017-02-22T09:17:15.37Z", "uptime":"0 days, 0 hours, 0 minutes, 11 seconds", "memory":"69.3 MB (%14.1) of 490.7 MB"} Service solr installed. [root@localhost bin]#
使用脚本【install_solr_service.sh 】注册solr为服务,若是不加参数,solr会默认把solr_home注册到 /var/solr/data ;并且默认用自带的jetty启动服务
install_solr_service.sh参数说明:
Supported OPTIONS include:
-d Directory for live / writable Solr files, such as logs, pid files, and index data; defaults to /var/solr
-i Directory to extract the Solr installation archive; defaults to /opt/
The specified path must exist prior to using this script.
-p Port Solr should bind to; default is 8983
-s Service name; defaults to solr
-u User to own the Solr files and run the Solr process as; defaults to solr
This script will create the specified user account if it does not exist.
注册成功以后,就能够用service的方式维护solr了,若是么有权限,记得sudo
service solr start/stop/restart/status
部署成功以后,打开控制台:http://localhost:8983/solr
常关注的地方
Dashboard:solr、lucene相关的版本,以及启动solr实例的jvm的相关参数
Logging:就是solr的日志输出控制台,其输出格式按照各自实例对应的solr_home下的log4j.properties配置文件的配置、若是是Tomcat部署的,log4j.properties在solr-tomcat\webapps\solr\WEB-INF\classes目录下
Core Admin:须要索引的复本实例
Java Properties:该solr实例的环境属性
Thread Dump:该solr实例的线程内存转储快照
Dataimport:此页签是配置数据源,导入数据更新数据相关
Full-import:全量更新导入数据,执行配置文件中的“query”,根据惟一id比对索引,原来有的删除,所有更新
Delta-import:增量更新导入,执行配置文件的“deltaImportQuery”、“deltaQuery”,只更新符合条件的数据
Clean:是否清理原来索引,执行full-import的时候,默认选中
Commit:提交,执行结果是否提交
Optimize:是否执行优化
Entity:默认主实体,dataConfig配置文件中的主实体
Documents:此页签是用于提交和跟新数据,通常不用
Files:列举了对应core的配置文件
查询页面
q – 查询字符串,必须的。
fl – 指定返回那些字段内容,用逗号或空格分隔多个。
start – 返回第一条记录在完整找到结果中的偏移位置,0开始,通常分页用。
rows – 指定返回结果最多有多少条记录,配合start来实现分页。
sort – 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。示例:(inStock desc, price asc)表示先 “inStock” 降序, 再 “price” 升序,默认是相关性降序。
wt – (writer type)指定输出格式,能够有 xml, json, php, phps, 后面 solr 1.3增长的,要用通知咱们,由于默认没有打开。
fq – (filter query)过虑查询,做用:在q查询符合结果中同时是fq查询符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031],找关键字mm,而且date_time是20081001到20091031之间的。官方文档:http://wiki.apache.org/solr/CommonQueryParameters
q.op – 覆盖schema.xml的defaultOperator(有空格时用”AND”仍是用”OR”操做逻辑),通常默认指定
df – 默认的查询字段,通常默认指定
qt – (query type)指定那个类型来处理查询请求,通常不用指定,默认是standard。
其它
indent – 返回的结果是否缩进,默认关闭,用 indent=true|on 开启,通常调试json,php,phps,ruby输出才有必要用这个参数。
version – 查询语法的版本,建议不使用它,由服务器指定默认值。
数据量小的时候,一台Solr服务器能彻底胜任这份工做,随着咱们应用慢慢长大,访问也愈来愈多,一台Solr服务器的弊病也逐渐显现如查询变慢了,机器宕机就没法继续提供服务,因而乎咱们引入了Solr集群,经过前端负载均衡和索引Replication来分担一台机器的压力,这样既能提升查询速度,也能避免单机故障问题并且是可伸缩的解决方案,一切看起来很OK,问题也暂时解决了,可是好景不长,随着应用的发展,数据也在与日俱增,须要索引的数据也愈来愈多,索引文件变得愈来愈庞大,Replication索引变得愈来愈低效高成本,每一个Solr实例都保存全量大索引数据的方式显然又成了系统性能和可伸缩性的瓶颈,若是能将大索引文件切分,分布在集群中不一样机器中且查询的准确性和可用性又不会受到影响该是件多么美好的事情啊,因而SolrCloud出现了...
SolrCloud是基于ZooKeeper和Solr的分布式解决方案,为Solr添加分布式功能,用于创建高可用,高伸缩,自动容错,分布式索引,分布式查询的Solr服务器集群;SolrCloud并不是一个新的软件发布包,而是Solr4.0版本新增组件用于跟ZooKeeper配合提供分布式功能,部署时只是修改启动配置;
安装过程
1. 准备zookeeper环境,这里再也不讲zookeeper的安装、部署
2.到Apache官网下载Solr-5.2.1安装包
3. 进入到Solr文件的目录,执行如下命令从压缩包中抽出安装脚本:
tar -xvzf solr-5.2.1.tgz solr-5.2.1/bin/install_solr_service.sh --strip-components=2
4. 运行安装脚本
执行如下命令安装Solr:
./install_solr_service.sh solr-5.2.1.tgz -i /usr/solr/solr5 -d /usr/solr/solr5 -u solr -s solr -p 8983
或者执行如下命令按照默认值安装:
./install_solr_service.sh solr-5.2.1.tgz
其实也能够直接解压安装包,而后自定义配置便可。
5.修改配置
执行如下命令编辑solr.in.sh文件:
vim /usr/solr5/solr.in.sh
参照以下进行修改:
SOLR_JAVA_MEM="-Xms1G -Xmx1G",内存限制能够按照须要设定。
ZK_HOST=" 127.0.0.1:2181, 127.0.0.1:2182, 127.0.0.1:2183"
6.按照上述步骤在其余节点执行安装
启动Solr服务并验证
1. 在Solr集群中各节点执行如下命令启动Solr服务:
service solr start
这里解释一下涉及到的一些概念
collection:solrcloud集群中逻辑意义上的完整索引,一般被划分为一个或多个shard(片),这些分片使用相同的config set。若是shard数超过一个,它就是分布式索引,solrcloud让你经过collection名称引用它,而不须要关心分布式检索时使用shard相关的参数。
Core:solr core,一个solr实例中能够包含多个core,每一个core能够独立完成索引和查询功能。collection和core的对应关系有点复杂,下边有张图,能很好的解释他们之间的关系,core能够理解为物理层面的分类;collection能够理解为逻辑层面的分类。在solrcloud的世界里,core被映射/抽象/关联成replicas(复本),多个复本之间经过zookeeper来管理,而且,会自动选举出一个leader结点,这都是zookeeper的内容了。
Leader:赢得选举的Shard replicas。每一个Shard有多个Replicas,这几个Replicas须要选举来肯定一个Leader。选举能够发生在任什么时候间,可是一般他们仅在某个Solr实例发生故障时才会触发。当索引documents时,SolrCloud会传递它们到此Shard对应的leader,leader再分发它们到所有Shard的replicas。
Replicas:Shard的一个拷贝。每一个Replica存在于Solr的一个Core中。一个命名为“test”的collection以numShards=1建立,而且指定replicationFactor设置为2,这会产生2个replicas,也就是对应会有2个Core,每一个在不一样的机器或者Solr实例。一个会被命名为test_shard1_replica1,另外一个命名为test_shard1_replica2。它们中的一个会被选举为Leader。
Shard:Collection的逻辑分片。每一个Shard被化成一个或者多个replicas,经过选举肯定哪一个是Leader。
建立分片和复本
建立collection并设置分片、和设置复本数目
bash /opt/solr/bin/solr create_collection -c farmer -n farmer -d /opt/solr-5.3.1/server/solr/configsets/sample_techproducts_configs/conf -shards 1 -replicationFactor 3
参数说明能够用如下命令查看:
bash /opt/solr/bin/solr create_collection -help
参数解释:
-c:建立collection的名字
-n:配置文件的文件夹名称
-d:须要上传到zookeeper上的配置文件目录
-shards:分片的数目
-replicationFactor:建立的collection的复本的数目
就是这种方式建立出来的集群core名字和collection不一样,是zookeeper默认拼接的,以下图:
并且,core的名字为:collection名字_shardX_replicaX,X为数字。看上去很怪。
第二种种方式建立collection
先上传配置文件到zookeeper
bash /opt/solr-5.3.1/server/scripts/cloud-scripts/zkcli.sh -zkhost 127.0.0.1:2181 -cmd upconfig -n worker -d /opt/solr-5.3.1/server/solr/configsets/sample_techproducts_configs/conf
参数解释:
-zkhost:zookeeper的地址
-cmd:bootstrap, upconfig(更新配置文件,zookeeper上没有就上传;有就跟新,以-n的值为collection辨别), downconfig(下载配置文件), linkconfig, makepath, put, putfile,get,getfile, list, clear,其他的命令没用过,等用过了再更新
-n:配置文件的名字,最终被用做collection的名字
-d:配置文件所在的目录,这里我用的“/opt/solr-5.3.1/server/solr/configsets/sample_techproducts_configs/conf ”solr默认的配置文件;可使用本身的配置文件目录,通常此配置文件的目录结构以下:
conf
├── currency.xml
├── lang
│ └── stopwords_en.txt
├── protwords.txt
├── _rest_managed.json
├── schema.xml
├── solrconfig.xml
├── stopwords.txt
└── synonyms.txt
这里须要注意的是,-zkhost,能够只写一个结点。
而后,逐个增长复本,我这里把:name、instanceDir、collection、shard、collection.configName都命名成同样了,
http://192.168.226.128:8985/solr/admin/cores?action=CREATE&name=worker&instanceDir=worker&dataDir=data&collection=worker&shard=worker&collection.configName=worker http://192.168.226.128:8984/solr/admin/cores?action=CREATE&name=worker&instanceDir=worker&dataDir=data&collection=worker&shard=worker&collection.configName=worker http://192.168.226.128:8983/solr/admin/cores?action=CREATE&name=worker&instanceDir=worker&dataDir=data&collection=worker&shard=worker&collection.configName=worker
参数含义:
name:新建core的名称
建立的core的命名规则:
coreName_shardName_replicaN
例如:建立pscp的集合,2个分片,每一个分片上面有两个备份
则命名以下:
pscp_shard1_replica1
pscp_shard1_replica2
pscp_shard2_replica1
pscp_shard2_replica2
shard:指定一个分配id,这个core将挂在那个分片上(随便写,若是尚未这个id,第一次会帮你建立)
collection.configName:从zookeeper中指定一份配置文件
instanceDir和dataDir:从下图看出他的含义
命名规则:instanceDir与name的名称相同,dataDir:统一建议命名为data
效果以下图:
更新solrcloud配置的方法
更新集群配置文件就是更新zookeeper上的配置文件,
bash /opt/solr-5.3.1/server/scripts/cloud-scripts/zkcli.sh -zkhost 127.0.0.1:2181 -cmd upconfig -n worker -d /opt/solr-5.3.1/server/solr/configsets/sample_techproducts_configs/conf
更新完配置文件以后,须要从新加载配置文件才能生效
http://192.168.226.128:8985/solr/admin/collections?action=RELOAD&name=worker
1,在maven工程环境下,pom.xml增长引用
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>5.3.1</version>
</dependency>
2,根据业务逻辑若是简单,能够直接使用SolrQuery,若是复杂能够实现本身的SolrQuery;同时还要实现本身的QueryResponse,处理相应的筛选项、分页、返回字段等。
3,若是使用的是单点的solr实例,须要直连指定的solr实例,须要指定ip、端口、core
HttpSolrClient solrClient = new HttpSolrClient(“http://localhost:8983/solr/core_name”);
4,若是使用的集群形式的solr,须要指定zookeeper
CloudSolrClient cloudSolrClient = new CloudSolrClient(“127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183/solr”);
若是须要额外的验证和参数用cloudSolrClient = new CloudSolrClient(zkHost, closeableHttpClient);
closeableHttpClient = HttpClientUtil.createClient(params);
同时,查询到时候,须要指定collection
QueryResponse response = solrClient.query("collection", solrQuery);
写在这里呢,主要是提示读者注意,也许你根本不会犯此类错误,就是在部署完solr以后,通常咱们都是默认root帐户去安装和部署,完事以后呢建立core或collection的时候老是提示找不到文件夹,或没法读取某文件,这是由于,solr服务默认建立solr用户,启动solr的用户也是solr。solr用户看不到root帐户建立的core或collection文件包括目录。因此,在部署完以后,切到solr用户启动solr和建立新的core或colletion。