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的绝对路径
    <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>

    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定义
     <!-- IK field -->
    <!-- IK fieldType -->
    <fieldType name="text_ik" class="solr.TextField">     
         <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>     
    </fieldType> 
    <field name="ik_name" type="text_ik" indexed="true" stored="true" multiValued="false" /> 

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中进行以下配置
    <!--  dataimport -->
    <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">  
      <lst name="defaults"> 
            <!--  xml名称自定义  -->
             <str name="config">data-config.xml</str>   
       </lst>   
    </requestHandler> 
        创建data-config.xml
    内容见2.增量更新示例
        在schema.xml中添加对应的field(在schema.xml中不存在的field)
    <field name="goods_id" type="int" indexed="true" stored="true" docValues="true" />
2.配置增量更新
参考: http://www.jianshu.com/p/c0b06643a467
参考示例:solr-4.10.3/example/example-DIH/solr/db/conf/db-data-config.xml  (里面有具体的配置可以参考)
配置data-config.xml(以下配置可以完成增量更新,具体配置看业务需求)
<?xml version="1.0" encoding="UTF-8" ?>  
<dataConfig>
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/ecmall" user="root" password=""/>
    <document name="goodsDoc">
        <!--query  全量查询语句-->
        <!--deltaImportQuery  增量导入语句-->
        <!--deletedPkQuery  被删除的文档主键查询-->
        <!--deltaQuery  被更新的文档主键查询-->

       <entity name="cloudGoods" pk="goods_id" transformer="DateFormatTransformer" 
             query="select * from cloud_goods "
             deltaImportQuery="SELECT * FROM cloud_goods WHERE goods_id = ${dih.delta.goods_id}"
             deletedPkQuery="SELECT * cloud_goods where is_delete = 1"
             deltaQuery="SELECT goods_id FROM cloud_goods where FROM_UNIXTIME(create_time,'%Y-%m-%d %H:%i:%S') > '${dataimporter.last_index_time}'" 
             >
         <field name="id" column="goods_id" />
         <field name="cloud_user_id" column="cloud_user_id" />
         <field name="goods_name" column="goods_name" />
         <field name="sku" column="sku" />
         <!-- 必须使用date类型? -->
         <!-- <field name="last_index_time" column="last_index_time" dateTimeFormat="yyyy-MM-dd HH:mm:ss"/> -->
      </entity>
   </document>
</dataConfig>

特别注意:
    此处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,添加监听
    <!-- dataimport scheduler -->
    <listener>
      <listener-class>
         org.apache.solr.handler.dataimport.scheduler.ApplicationListener
       </listener-class>
     </listener>   
    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。
    <solr>
      <solrcloud>
        <str name="host">${host:}</str>
        <int name="hostPort">8080</int>
        <str name="hostContext">${hostContext:solr}</str>
        <int name="zkClientTimeout">${zkClientTimeout:15000}</int>
        <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
        <str name="zkHost">127.0.0.1:7181,hadoop.datanode3.com:4181,hadoop.datanode5.com:4181</str>
    </solrcloud>
    
      <shardHandlerFactory name="shardHandlerFactory"
        class="HttpShardHandlerFactory">
        <int name="socketTimeout">${socketTimeout:0}</int>
        <int name="connTimeout">${connTimeout:0}</int>
      </shardHandlerFactory>
    
    </solr>
    solrHome/collection1/core.properties:删除该文件(这样集群启动后就没有collection)
    solrHome/collection1/conf/solrconfig.xml:修改如下配置项:
        <dataDir>${solr.data.dir:/data_solr/example-collection}</dataDir>

     将所有的这些配置同步到各个节点上。(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
       <?xml version="1.0" encoding="UTF-8" ?>
    
        <dataConfig>
            <dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/ecmall?useUnicode=true&characterEncoding=UTF-8" user="root" password=""/>
            <document name="goodsDoc">
               <entity name="cloud_goods"  query="select * from cloud_goods where status = 1 " >
                 <field name="id" column="id" />
                 <field name="goods_id" column="goods_id" />
                 <field name="cloud_user_id" column="cloud_user_id" />
                 <field name="goods_name" column="goods_name" />
                 <field name="sku" column="sku" />
              </entity>
           </document>
        </dataConfig>
    
    3.在schema.xml中配置对应的字段(如果存在则不用)
        
    4.在solrconfig.xml中引入data-config.xml
         <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">  
              <lst name="defaults"> 
                     <str name="config">data-config.xml</str>   
               </lst>   
        </requestHandler> 
    
    
    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<<refCount=0;path=/Users/bjlx/Work/dataDir/solrHome9070/europe-collection_shard3_replica1/data/index;done=false>>]
    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.<init>(SolrCore.java:881)
        at org.apache.solr.core.SolrCore.<init>(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.<init>(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)
原因:
未知,未影响增量更新
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,732评论 6 342
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • Solr&ElasticSearch原理及应用 一、综述 搜索 http://baike.baidu.com/it...
    楼外楼V阅读 7,247评论 1 17
  • 最近都是一副生人勿近的样子,我怎么了呢?快死了。 没有能从工作中找到意义,但我也只剩工作了,因为不工作的时间我都躺...
    百事可爱哟阅读 164评论 0 0
  • 昨天在网络上看到一段话,有人总结的中国女人的“四不幸”:当妈式择偶,保姆式妻子,丧偶式育儿,守寡式的婚姻!...
    一路阳光_720c阅读 329评论 0 0