solr实践

参考资料:
https://wiki.apache.org/solr/FrontPage

http://docs.spring.io/spring-data/solr/docs/current/reference/html/
http://projects.spring.io/spring-data-solr/#quick-start

solr中国:http://www.solr.cc/blog/

动态查询:https://www.petrikainulainen.net/programming/solr/spring-data-solr-tutorial-dynamic-queries/

介绍:https://www.petrikainulainen.net/programming/solr/spring-data-solr-tutorial-introduction-to-solr/

用maven构建solr:https://www.petrikainulainen.net/programming/maven/running-solr-with-maven/

配置:https://www.petrikainulainen.net/programming/solr/spring-data-solr-tutorial-configuration/

https://myjeeva.com/solrcloud-cluster-single-collection-deployment.html#deploying-solrcloud

全教程参考链接:
http://lies-joker.iteye.com/blog/2093818

数据导入:
http://www.2cto.com/kf/201602/489972.html
问题:


一.solr是什么?

Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时 ==实现了可配置、可扩展,并对索引、搜索性能进行了优化==。

sorl 与lucene的区别

Lucene是一个开放源代码的全文检索引擎工具包,它不是一个完整的全文检索引擎,Lucene提供了完整的查询引擎和索引引擎,目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者以Lucene为基础构建全文检索引擎。

Solr的目标是打造一款企业级的搜索引擎系统,它是一个搜索引擎服务,可以独立运行,通过Solr可以非常快速的构建企业的搜索引擎,通过Solr也可以高效的完成站内搜索功能。

二.sorl有什么?

Solr 可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,Solr==索引的实现方法很简单==,++用 POST 方法向Solr服务器发送一个描述Field及其内容的XML文档,Solr根据xml文档添加、删除、更新索引++ 。Solr搜索只需要发送HTTP GET请求,然后对Solr返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况

2.1 solr的数据模型(与关系型数据库对应关系(相似性))

solr mysql
index(索引) table(表)
document(文档) row(一条记录)
field(字段) column(列)

三.solr怎么用?

3.1 下载

从Solr官方网站(http://lucene.apache.org/solr/ )下载Solr4.10.3,根据Solr的运行环境,Linux下需要下载lucene-4.10.3.tgz,windows下需要下载lucene-4.10.3.zip。
Solr使用指南可参考:https://wiki.apache.org/solr/FrontPage。

下载solr-4.10.3.tar并解压:

bin:solr的运行脚本
contrib:solr的一些贡献软件/插件,用于增强solr的功能。
dist:该目录包含build过程中产生的war和jar文件,以及相关的依赖文件。
docs:solr的API文档
example:solr工程的例子目录:
-   example/solr:
    该目录是一个包含了默认配置信息的Solr的Core目录。
-   example/multicore:
    该目录包含了在Solr的multicore中设置的多个Core目录。 
-   example/webapps:
    该目录中包括一个solr.war,该war可作为solr的运行实例工程。
licenses:solr相关的一些许可信息

3.2 运行环境

solr 需要运行在一个Servlet容器中,Solr4.10.3要求jdk使用1.7以上,Solr默认提供Jetty(java写的Servlet容器),也可以使用Tocmat作为Servlet容器,

现使用环境如下:
    Solr:Solr4.10.3
    Jdk:jdk1.7.0_72
    Tomcat:apache-tomcat-7.0.53

3.3 部署solr

 1)将solr-4.10.3.tgz解压,
    2)将solr-4.10.3/example/solr目录拷贝到自定义目录下,重命名为solrHome
    3)找到solr-4.10.3/example/webapp/solr.war
    4)将solr.war拷贝到tomcat/webapps/目录下
    5)解压到当前目录下(启动tomcat会自动将war包解压)
    6)将solr.war删除

    7)修改tomcat/webapps/solr/WEB-INF/web.xml ,将以下配置注释去掉,指定env-entry-value为solrHome的绝对路径
    
       solr/home
       /put/your/solr/home/here
       java.lang.String
    

    8)复制solr-4.10.3/example/lib/ext下所有jar包到tomcat/lib下
    9)复制solr-4.10.3/example/resources/log4j.properties到tomcat/webapps/solr/WEB-INF/classes目录下,如果classes目录不存在,先创建
    10)启动tomcat,在浏览器访问localhost:port/solr

3.4 配置solr

1.配置solr/conf(可以针对每个core的conf,也可以将conf单独放置进行配置,上传到zookeeper)

3.5 配置IK分词器

1.需要的jar
    IK+Analyzer+2012FF_hf1/IKAnalyzer2012FF_u1.jar
    将jar放在tomcat/webapps/solr/WEB-INF/lib下,重启tomcat
    
2.需要的配置文件
    IK+Analyzer+2012FF_hf1/IKAnalyzer.cfg.xml
    IK+Analyzer+2012FF_hf1/stopword.dic
    将以上配置文件放在slor/conf下
    
3.修改solr/conf/schema.xml
    添加fieldType和field定义
     
    
         
              
     
     

3.6 配置dataimport

 1.从关系型数据库导入数据
    1)需要的jar
        solr-4.10.3/dist/目录下的solr-dataimporthandler-4.10.3.jar和solr-dataimporthandler-extras-4.10.3.jar
        另外需要数据库驱动jar,这里用的mysql的mysql-connector-java-5.1.30.jar

        将以上jar包放在tomcat/webapps/solr/WEB-INF/lib下,重启tomcat
        
    2)配置solr/conf
        在solrconfig.xml中进行以下配置
    
      
       
            
             data-config.xml   
          
     
        创建data-config.xml
    内容见2.增量更新示例
        在schema.xml中添加对应的field(在schema.xml中不存在的field)
    
2.配置增量更新
参考: http://www.jianshu.com/p/c0b06643a467
参考示例:solr-4.10.3/example/example-DIH/solr/db/conf/db-data-config.xml  (里面有具体的配置可以参考)
配置data-config.xml(以下配置可以完成增量更新,具体配置看业务需求)
  

    
    
        
        
        
        

       
         
         
         
         
         
         
      
   


特别注意:
    此处cloud_goods表中的create_time为int类型的unix时间,需要转换后进行比较
    field的column建议使用大写,否则会出现无数据情况
 
执行增量更新命令:
    全导入:
        http://127.0.0.1:9080/solr/collection1/dataimport?command=full-import&commit=ture
    增量导入:
        http://127.0.0.1:9080/solr/collection1/deltaimport?command=delta-import&clean=false&commit=ture
    查看导入状态
        http://127.0.0.1:9080/solr/collection1/dataimport?command=status
3.配置定时增量更新(全量更新需要删除原索引,最好只在第一次同步数据时使用)  
参考:http://www.jianshu.com/p/c0b06643a467
http://www.cnblogs.com/chenying99/archive/2012/08/10/2631680.html

jar包:http://code.google.com/p/solr-data-import-scheduler/  (内有dataimport.properties)
    1)将jar包导入到tomcat/lib
        
    2)配置tomcat/webapps/solr/WEB-INF/web.xml,添加监听
    
    
      
         org.apache.solr.handler.dataimport.scheduler.ApplicationListener
       
        
    3)在solrHome/conf下创建dataimport.properties(jar包里有),用户配置dataimport
        参数配置:
            #设置开始同步,1为开启
            syncEnabled=1 
            #设置同步的core
            syncCores=core1,core2 
            #设置同步的节点服务器ip或域名
            server=127.0.0.1    
            #设置同步节点solr应用所在的端口,默认为80
            port=8080
            #设置同步节点solr应用的应用名称(一般就是tomcat/webapps/solr  对应这里,如果web.xml有指定,以最终应用名称为准)
            webapp=solr 
            #配置同步命令执行url,dataimport固定(如果做其他用途可以单独修改),
            #注意/dataimport后接?不是&
            #command指明执行的命令,这里可以为delta-import(增量导入)和full-import(全量导入)
            #clean表示是否清除索引,commit表示执行完成后是否提交
            params=/dataimport?command=delta-import&clean=false&commit=true 
            #间隔时间,默认为30,单位:分钟
            interval=1
    遇到的问题:
        因为使用zookeeper统一管理solr配置文件
        而定时增量更新需要在solr节点上配置监听器,读取当前节点solrHome/conf/dataimport.propertise
        现在暂无办法使单节点solr读取zookeeper管理的dataimport.propertise文件
        另外,每个节点的ip、port和webapp都可能不相同,dataimport.propertise配置还需要进一步了解
    
    暂定解决方案:
        在单节点配置定时增量更新,利用solr集群主从复制的功能进行数据同步
        
        弊端:如果只在一个节点配置定时,如果该节点宕机,则无法进行定时增量更新
                如果每个节点都配置定时,配置规则待定,更新内容应该是一致的,或者考虑每个节点更新部分数据
        扩展:研究solr主从复制相关配置,进一步调优
        
    扩展方法:
        使用linux crontab设置定时任务,指定自定义脚本来完成
        脚本内容(可以扩展输入的ip,port和webapp):
            curl "http://ip:port/webapp/dataimport?command=delta-import&clean=false&commit=true"

四.进阶

4.1搭建zookeeper集群

1)下载zookeeper

2)解压到指定目录

3)配置zookeeper
    在zookeeper_home/下创建data和logs目录
    重命名zookeeper_home/conf/zoo_sample.cfg 为zoo.cfg
    配置zoo.cfg
    # The number of milliseconds of each tick
    tickTime=2000
    # The number of ticks that the initial
    # synchronization phase can take
    initLimit=10
    # The number of ticks that can pass between
    # sending a request and getting an acknowledgement
    syncLimit=5
    # the directory where the snapshot is stored.
    # do not use /tmp for storage, /tmp here is just
    # example sakes.
    
    #指定data目录
    dataDir=/Users/bjlx/Work/otherServer/zooServer/zookeeper7218/data
     ##指定dataLogDir
    dataLogDir=/Users/bjlx/Work/otherServer/zooServer/zookeeper7218/logss
    
    # the port at which the clients will connect
    clientPort=7281
    # the maximum number of client connections.
    # increase this if you need to handle more clients
    #maxClientCnxns=60
    #
    # Be sure to read the maintenance section of the
    # administrator guide before turning on autopurge.
    #
    # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
    #
    # The number of snapshots to retain in dataDir
    #autopurge.snapRetainCount=3
    # Purge task interval in hours
    # Set to "0" to disable auto purge feature
    #autopurge.purgeInterval=1
    
   
    #申明zookeeper serer
    #格式:server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口
    server.1=127.0.0.1:7118:7128
    server.2=127.0.0.1:7218:7228
    server.3=127.0.0.1:7318:7328
4)启动zookeeper:
 zookeeper_home bin $ ./zkServer.sh start ../conf/zoo.cfg
 单机配置多个zookeeper时(伪集群),每个zk启动时指明使用的zoo.cfg,通过zoo.cfg的配置区分各个监听端口
 
 查看zookeeper_home/zookeeper.out检查日志
 刚启动时报错是正常的,等所有zookeeper server启动后,会自动进行选举
 查看zookeeper状态:
    zookeeper_home bin $ ./zkServer.sh status
    ZooKeeper JMX enabled by default
    Using config: /Users/bjlx/Work/otherServer/zooServer/zookeeper7218/bin/../conf/zoo.cfg
    Mode: leader
 
   
 5)使用客户端接入
 zookeeper_home$ sh bin/zkCli.sh –server localhost:2181 
 
 
 6)查看zookeeper状态
  echo mntr | nc localhost `clientPort`
报错:
Unable to read additional data from server sessionid 0x0, likely server has closed socket, closing socket connection and attempting reconnect

参考资料
    http://blog.csdn.net/hengyunabc/article/details/41450003
    http://blog.csdn.net/sangyongjia/article/details/50372670
    
原因:
    zookeeper服务没有正常启动,要在单机启动zookeeper伪集群,需要在启动zookeeper时指定使用的zoo.cfg,方便区分各自的监听端口(包括客户端访问端口,与leader服务器交换信息端口和选举leader服务器端口)

解决:


4.2 将zookeeper于tomcat关联

4.3搭建solr集群

参考:http://www.tuicool.com/articles/JNFjii
1、搭建单机solr
   参见3.3 部署solr
   
   
2、集群搭建(http://blog.csdn.net/xyls12345/article/details/27504965)
    1)整合tomcat和zookeeper
        修改solr(集群需要每个都修改)所在的tomcat/bin/catalina.sh文件,加入以下配置
#将zookeeper集群中的主机id和client端口配置进来
#主tomcat需要指定Dbootstrap_confdir,其他从tomcat只需要指定DzkHost即可
#配置在 #-------- Excute The Request Command -----------------------------下面
#JAVA_OPTS="-DzkHost=zookeeper1:clientport1,192.168.0.6:2181,192.168.0.7:2181"
JAVA_OPTS="$JAVA_OPTS -Dbootstrap_confdir=/Users/bjlx/Work/dataDir/solrHome9080/collection1/conf -Dcollection.configName=solrCloudConf -DzkHost=127.0.0.1:7181,127.0.0.1:7281,127.0.0.1:7381"

        报错:
12213 [coreLoadExecutor-6-thread-1] INFO  org.apache.solr.cloud.ZkController  – waiting to find shard id in clusterstate for collection1
12213 [coreLoadExecutor-6-thread-1] INFO  org.apache.solr.cloud.ZkController  – Check for collection zkNode:collection1
12214 [coreLoadExecutor-6-thread-1] INFO  org.apache.solr.cloud.ZkController  – Creating collection in ZooKeeper:collection1
12215 [coreLoadExecutor-6-thread-1] INFO  org.apache.solr.cloud.ZkController  – Looking for collection configName
12217 [coreLoadExecutor-6-thread-1] INFO  org.apache.solr.cloud.ZkController  – Could not find collection configName - pausing for 3 seconds and trying again - try: 1
15220 [coreLoadExecutor-6-thread-1] INFO  org.apache.solr.cloud.ZkController  – Could not find collection configName - pausing for 3 seconds and trying again - try: 2
18223 [coreLoadExecutor-6-thread-1] INFO  org.apache.solr.cloud.ZkController  – Could not find collection configName - pausing for 3 seconds and trying again - try: 3
21228 [coreLoadExecutor-6-thread-1] INFO  org.apache.solr.cloud.ZkController  – Could not find collection configName - pausing for 3 seconds and trying again - try: 4
24230 [coreLoadExecutor-6-thread-1] INFO  org.apache.solr.cloud.ZkController  – Could not find collection configName - pausing for 3 seconds and trying again - try: 5
27232 [coreLoadExecutor-6-thread-1] ERROR org.apache.solr.cloud.ZkController  – Could not find configName for collection collection1
27234 [coreLoadExecutor-6-thread-1] ERROR org.apache.solr.core.CoreContainer  – Error creating core [collection1]: Could not find configName for collection collection1 found:null
org.apache.solr.common.cloud.ZooKeeperException: Could not find configName for collection collection1 found:null
    at org.apache.solr.cloud.ZkController.getConfName(ZkController.java:1319)
    at org.apache.solr.cloud.ZkController.createCollectionZkNode(ZkController.java:1245)
    at org.apache.solr.cloud.CloudConfigSetService.createCoreResourceLoader(CloudConfigSetService.java:36)
    at org.apache.solr.core.ConfigSetService.getConfig(ConfigSetService.java:58)
    at org.apache.solr.core.CoreContainer.create(CoreContainer.java:489)
    at org.apache.solr.core.CoreContainer$1.call(CoreContainer.java:255)
    at org.apache.solr.core.CoreContainer$1.call(CoreContainer.java:249)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
27240 [localhost-startStop-1] INFO  org.apache.solr.servlet.SolrDispatchFilter  – user.dir=/Users/bjlx/Work/webServer/tomcat8_solr_9080
27240 [localhost-startStop-1] INFO  org.apache.solr.servlet.SolrDispatchFilter  – SolrDispatchFilter.init() done
27-Mar-2017 10:54:51.388 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /Users/bjlx/Work/webServer/tomcat8_solr_9080/webapps/solr has finished in 30,122 ms
27-Mar-2017 10:54:51.397 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-9080"]
27-Mar-2017 10:54:51.405 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-9089"]
27-Mar-2017 10:54:51.406 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 31914 ms
27543 [http-nio-9080-exec-3] ERROR org.apache.solr.servlet.SolrDispatchFilter  – null:org.apache.solr.common.SolrException: SolrCore 'collection1' is not available due to init failure: Could not find configName for collection collection1 found:null
    at org.apache.solr.core.CoreContainer.getCore(CoreContainer.java:745)
    at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:347)
            
        问题分析及解决:
待定
2)配置solr collection配置文件
solrHome/solr.xml:配置hostport为tomcat的服务端口;配置zkHhost。
    
      
        ${host:}
        8080
        ${hostContext:solr}
        ${zkClientTimeout:15000}
        ${genericCoreNodeNames:true}
        127.0.0.1:7181,hadoop.datanode3.com:4181,hadoop.datanode5.com:4181
    
    
      
        ${socketTimeout:0}
        ${connTimeout:0}
      
    
    
    solrHome/collection1/core.properties:删除该文件(这样集群启动后就没有collection)
    solrHome/collection1/conf/solrconfig.xml:修改如下配置项:
        ${solr.data.dir:/data_solr/example-collection}

     将所有的这些配置同步到各个节点上。(TODO solr配置的主机地址和端口是否修改???)
3)上传solr配置文件(使用solrhomt/{core}/conf)到zookeeper中
参考资料:http://lies-joker.iteye.com/blog/2094953
扩展资料:http://kb.cnblogs.com/page/86827/
        可以全部上传,也可以单独上传
    lzh@bjlxdeMacBook-Pro cloud-scripts $ pwd
    /Users/bjlx/Downloads/developSoft/Solr/solr-4.10.3/example/scripts/cloud-scripts
    lzh@bjlxdeMacBook-Pro cloud-scripts $ ll
    total 24
    drwxr-xr-x@ 5 lzh  staff  170 12 10  2014 ./
    drwxr-xr-x@ 5 lzh  staff  170  3 27 10:59 ../
    -rw-r--r--@ 1 lzh  staff  317 12  1  2014 log4j.properties
    -rw-r--r--@ 1 lzh  staff  707 12  1  2014 zkcli.bat
    -rwxr-xr-x@ 1 lzh  staff  485 12  1  2014 zkcli.sh*
    lzh@bjlxdeMacBook-Pro cloud-scripts $ ./zkcli.sh -zkhost 127.0.0.1:7181,127.0.0.1:7281,127.0.0.1:7381 -cmd upconfig  -confdir /Users/bjlx/Work/dataDir/solrHome9080/collection1/conf -confname solrCloudConf
    
命令解析:
    使用的只solr下载包/example/scripts/cloud-scripts/zkcli.sh 脚本
    命令说明 :
        -zkhost zookeeperserverIp:clientPort,zookeeperserverIp2:clientPort2,... 
        -cmd upconfig  固定命令 说明功能
        -confdir 指定上传配置文件的目录(使用sorlhome/{core}/conf目录即可)
        -confname 指定配置名称
        
单文件上传:
     lzh@bjlxdeMacBook-Pro cloud-scripts $./zkcli.sh -zkhost hadoop34:2181,hadoop35:2181,hadoop36:2181 -cmd putfile /configs/alpha_wenuser/schema.xml  conf/schema.xml 
    
    
    ./zkcli.sh -zkhost 127.0.0.1:7181,127.0.0.1:7281,127.0.0.1:7381 -cmd putfile   /configs/myconf/schema.xml /Users/bjlx/Work/dataDir/solr-config-files/schema.xml
    
    
    putfile命令是用来上传单个文件的,所以需要先rmr删除zookeeper上的文件(/configs/alpha_wenuser/schema.xml),在提交这条命令,不然会报错:KeeperErrorCode = NodeExists for /configs/investor/schema.xml 
    
    说明:
        putfile 后跟zookeeper上配置文件路径 后跟本地配置文件路径
        
效果:


查看zookeeper配置:
    lzh@bjlxdeMacBook-Pro bin $ pwd
    /Users/bjlx/Work/otherServer/zooServer/zookeeper7118/bin
    lzh@bjlxdeMacBook-Pro bin $ ./zkCli.sh  -server 127.0.0.1:7181
    [zk: 127.0.0.1:7181(CONNECTED) 0] ls /
    [configs, zookeeper, overseer, aliases.json, live_nodes, collections, overseer_elect, clusterstate.json]
    [zk: 127.0.0.1:7181(CONNECTED) 1] ls /configs
    [solrCloudConf]
    [zk: 127.0.0.1:7181(CONNECTED) 2] ls /live_nodes
    [127.0.0.1:9060_solr, 127.0.0.1:9080_solr, 127.0.0.1:9070_solr]
    
    [zk: 127.0.0.1:7181(CONNECTED) 7] ls /configs/solrCloudConf
    [currency.xml, mapping-FoldToASCII.txt, protwords.txt, scripts.conf, synonyms.txt, stopwords.txt, _schema_analysis_synonyms_english.json, velocity, admin-extra.html, update-script.js, _schema_analysis_stopwords_english.json, solrconfig.xml, admin-extra.menu-top.html, elevate.xml, schema.xml, clustering, _rest_managed.json, mapping-ISOLatin1Accent.txt, spellings.txt, xslt, lang, admin-extra.menu-bottom.html]
    [zk: 127.0.0.1:7181(CONNECTED) 8]

3、 通过集群api 管理集群(Core Admin)(创建collection和core)
    参考:https://www.zhihu.com/question/41870519
    http://eksliang.iteye.com/blog/2124078
有两种方式:一种是创建collection,自动分配shard和replica;另一种是创建collection,手动分配shard和replica。推荐后者,因为可控性强。

方式一:

curl
'http://localhost:9080/solr/admin/collections?action=CREATE&name=cloud_collection&numShards=3&replicationFactor=3&maxShardsPerNode=3'

这样会出来一个collection,它有3个shard,每个shard有1个数据节点,2个备份节点,即该collection共有9个core

缺点:不灵活,不能选择适合的节点,不能选择数据存放路径,不能选择实例存放路径

方式二:

curl 'http://localhost:9080/solr/admin/cores?action=CREATE&name=cz_collection-shard1-replica1&instanceDir=/usr/solr/cz_collection-shard1-replica1&dataDir=/data_solr/cz_collection-shard1-replica1&collection=cz_collection&shard=shard1'

curl 'http://localhost:8080/solr/admin/cores?action=CREATE&name=cz_collection-shard1-replica2&instanceDir=/usr/solr/cz_collection-shard1-replica2&dataDir=/data_solr/cz_collection-shard1-replica2&collection=cz_collection&shard=shard1'


这样可以创建出一个collection,并自己指定该collection的shard和replica的所有配置项。还可以继续接着创建。

以上两种方式的具体api调用,请参看solr官方文档。
    附加:
    删除不用的Collection。
    http://192.168.25.154:8180/solr/admin/collections?action=DELETE&name=collection1


4、集群运维
    a.集群会发生变化的就是collection的配置,因此当collection的配置文件发生变化后就应该使用命令更新zookeeper中配置文件信息,solr很好提供了运维工具:
        详见上文:上传solr配置文件(使用solrhomt/{core}/conf)到zookeeper中
    
    b.对于collection,shard,core运维使用api接口即可

实践:

    1.主从tomcat的tomcat/bin/catalina.sh  中 JAVA_OPTS使用相同配置(只指定-Dzk即可)
    2.单独指定一个solr-config目录,目录下放sorl-4.10.x/example/solr/collection1/conf目录下所有文件(不需要做任何修改)
    3.使用solr-4.10.3/example/scripts/cloud-scripts/zkCli.sh 上传solr-config配置文件
         ./zkcli.sh -cmd upconfig -zkhost 127.0.0.1:7181,127.0.0.1:7281,127.0.0.1:7381 -confdir /Users/bjlx/Work/dataDir/solr-config-files/ -confname myconf

    4.使用solr api创建collection
        http://localhost:9080/solr/admin/collections?action=CREATE&name=cloud_collection&numShards=3&replicationFactor=3&maxShardsPerNode=3
        
        后续可以研究使用方法二:单独指定collection和core的目录等
    
    注意:出现错误时,可以清除zookeeper配置文件等(详见上文),恢复集群状态
    

4.4 solrJ使用

4.5 solr优化

> 参考:http://www.solr.cc/blog/?p=58

五.问题:

Solr错误:sorry, no dataimport-handler defined!

原因是:apache-tomcat-6.0.35\webapps\solr\WEB-INF\lib没有导入
solr-dataimporthandler-4.1.0.jar
solr-dataimporthandler-extras-4.1.0.jar


解决:
    1.导入以上3各jar包
    2.在solrHome/{core}/conf/下创建data-config.xml
       
    
        
            
            
               
                 
                 
                 
                 
                 
              
           
        
    
    3.在schema.xml中配置对应的字段(如果存在则不用)
        
    4.在solrconfig.xml中引入data-config.xml
           
               
                     data-config.xml   
                  
         
    
    
    5.重启tomcat?
    
    

使用solr api创建collection或core

Caused by: Lock obtain timed out: NativeFSLock@/Users/bjlx/Work/dataDir/solrHome9080/collection1/dat

solr集群启动报错

> solr 集群启动没有选举出leader,报错index lock

参考:http://stackoverflow.com/questions/17444493/caused-by-org-apache-solr-common-solrexception-index-locked-for-write-for-core

报错:
    13973 [coreLoadExecutor-5-thread-3] INFO  org.apache.solr.core.CachingDirectoryFactory  – looking to close /Users/bjlx/Work/dataDir/solrHome9070/europe-collection_shard3_replica1/data/index [CachedDir<>]
    13973 [coreLoadExecutor-5-thread-3] INFO  org.apache.solr.core.CachingDirectoryFactory  – Closing directory: /Users/bjlx/Work/dataDir/solrHome9070/europe-collection_shard3_replica1/data/index
    13973 [coreLoadExecutor-5-thread-3] ERROR org.apache.solr.core.CoreContainer  – Error creating core [europe-collection_shard3_replica1]: Index locked for write for core europe-collection_shard3_replica1
    org.apache.solr.common.SolrException: Index locked for write for core europe-collection_shard3_replica1
        at org.apache.solr.core.SolrCore.(SolrCore.java:881)
        at org.apache.solr.core.SolrCore.(SolrCore.java:654)
        at org.apache.solr.core.CoreContainer.create(CoreContainer.java:491)
        at org.apache.solr.core.CoreContainer$1.call(CoreContainer.java:255)
        at org.apache.solr.core.CoreContainer$1.call(CoreContainer.java:249)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
    Caused by: org.apache.lucene.store.LockObtainFailedException: Index locked for write for core europe-collection_shard3_replica1
        at org.apache.solr.core.SolrCore.initIndex(SolrCore.java:516)
        at org.apache.solr.core.SolrCore.(SolrCore.java:785)
        ... 8 more
解决:
    停止该节点
    删除对应core/data/index/write.lock
    重启该节点 

solr集群启动没有选举leader

参考:http://mt.sohu.com/20170321/n484043744.shtml

查看tomcat进行发现有一个tomcat进程卡死了,kill掉之后,重启集群后,自动选举了leader

定时增量更新报错:missing mandatory uniqueKey field: id

错误日志:
0616 [Thread-9] INFO  org.apache.solr.handler.dataimport.JdbcDataSource  – Time taken for getConnection(): 17
60621 [Thread-9] WARN  org.apache.solr.handler.dataimport.SolrWriter  – Error creating document : SolrInputDocument(fields: [cloud_price=12.10, cloud_cateName=, cloud_cateId1=0, cloud_sku=1312314131313, cloud_skuString=1312314131313, cloud_brand=蒙牛1, cloud_cateId2=0, cloud_goodsName=测试数据1, cloud_specName1=, cloud_specName2=, cloud_createTime=1490870769, cloud_goodsId=22210, cloud_tags=, cloud_defaultImage=, cloud_status=1, description=测试数据1, cloud_updateTime=1490870769, cloud_userId=1, cloud_storeId=0, cloud_normalGoodsId=2, cloud_orderCanUse=0])
org.apache.solr.common.SolrException: Document is missing mandatory uniqueKey field: id
    at org.apache.solr.update.AddUpdateCommand.getIndexedId(AddUpdateCommand.java:93)
    at org.apache.solr.update.processor.DistributedUpdateProcessor.versionAdd(DistributedUpdateProcessor.java:939)
    at org.apache.solr.update.processor.DistributedUpdateProcessor.processAdd(DistributedUpdateProcessor.java:692)
    at org.apache.solr.update.processor.LogUpdateProcessor.processAdd(LogUpdateProcessorFactory.java:100)
    at org.apache.solr.handler.dataimport.SolrWriter.upload(SolrWriter.java:71)
    at org.apache.solr.handler.dataimport.DataImportHandler$1.upload(DataImportHandler.java:265)
    at org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:511)
    at org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:415)
    at org.apache.solr.handler.dataimport.DocBuilder.doDelta(DocBuilder.java:364)
    at org.apache.solr.handler.dataimport.DocBuilder.execute(DocBuilder.java:224)
    at org.apache.solr.handler.dataimport.DataImporter.doDeltaImport(DataImporter.java:444)
    at org.apache.solr.handler.dataimport.DataImporter.runCmd(DataImporter.java:482)
    at org.apache.solr.handler.dataimport.DataImporter$1.run(DataImporter.java:461)
60622 [Thread-9] INFO  org.apache.solr.handler.dataimport.DocBuilder  – Delta Import completed successfully
60623 [Thread-9] INFO  org.apache.solr.handler.dataimport.DocBuilder  – Time taken = 0:0:0.401
60623 [Thread-9] INFO  org.apache.solr.update.processor.LogUpdateProcessor  – [collection1] webapp=/solr path=/dataimport params={commit=true&clean=false&command=delta-import} status=0 QTime=24 {} 0 24

问题原因:
data-config.xml中配置的query、deltaImportQuery、deletedPkQuery查询内容不一致,query中查询出了id对应的column值,在另外两个参数的sql中没有id对应的column(类型和字段一致)
id在原schema.xml中定义为string类型

定时增量更新报错

报错:
120181 [Thread-10] INFO  org.apache.solr.handler.dataimport.DocBuilder  – Starting delta collection.
120182 [Thread-10] INFO  org.apache.solr.handler.dataimport.DocBuilder  – Running ModifiedRowKey() for Entity: cloud_goods_stock
120183 [http-nio-9080-exec-2] ERROR org.apache.solr.servlet.SolrDispatchFilter  – null:org.apache.catalina.connector.ClientAbortException: java.io.IOException: 断开的管道
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:393)
原因:
未知,未影响增量更新

你可能感兴趣的:(solr实践)