• Ali_Cloud++:阿里云-单机版 solr4.10.3 安装部署


    本次案例演示:环境

    1、solr-4.10.3.tgz.tgz

    2、apache-tomcat-7.0.88.tar.gz

    3、IKAnalyzer2012FF_hf1.zip

    资源下载:Download  提取码:syj6

    1):下载文件资源上传到指定目录下(自定义路径)

    2):解压到指定目录下

    tar -zxvf solr-4.10.3.tgz.tgz -C ./install/

    3):切换到 解压后的文件 dist 下

    cd solr-4.10.3/dist/

    3-1):拷贝 solr-4.10.3.war 到 tomcat/webapp/ 下  (请提前解压 所需要的的 tomcat

    cp solr-4.10.3.war /opt/solr/tomcat/apache-tomcat-7.0.88/webapps/solr.war

    4):启动 tomcat 进行 solr 自动解压缩

    cd /opt/tomcat/apache-tomcat-7.0.88/bin/
    
    ./startup.sh 

    5):复制 log 日志jar 到 solr 中

    cd /opt/solr/solr-4.10.3/example/lib/ext/
    
    cp * /opt/tomcat/apache-tomcat-7.0.88/webapps/solr/WEB-INF/lib/

    6):配置 solr home

    cd /opt/solr/install/solr-4.10.3/example/

    cp -r solr /opt/solr/install/solrhome

    7):solr 与 solrhome 建立关系   【修改 solr 中的 web.xml】

    cd /opt/solr/tomcat/apache-tomcat-7.0.88/webapps/solr/WEB-INF/

    8):启动 tomcat 进行访问 solr 测试【 ip:tomcat端口/solr】

    以上 我们的 solr 服务就已经 搭建成功了。

    9):配置 IK 中文分词器

    9-1):解压分词器包 (unzip 指令需要 yum安装)

    unzip  IKAnalyzer2012FF_hf1.zip 

    9-2):重命名

    mv IK Analyzer 2012FF_hf1/ IKAnalyzer2012FF_hf1

    9-3):将 IKAnalyzer2012FF_u1.jar 添加到 solr 工程中去

    cp IKAnalyzer2012FF_u1.jar /opt/tomcat/apache-tomcat-7.0.88/webapps/solr/WEB-INF/lib/

     首先创建 classes 目录:

    mkdir /opt/tomcat/apache-tomcat-7.0.88/webapps/solr/WEB-INF/classes

    拷贝:

    cp IKAnalyzer.cfg.xml ext_stopword.dic mydict.dic /opt/tomcat/apache-tomcat-7.0.88/webapps/solr/WEB-INF/classes/

    查看:

    ll  /opt/tomcat/apache-tomcat-7.0.88/webapps/solr/WEB-INF/classes

    10):定义 fieldType 指定 使用中文分词器

     

    cd /opt/solr/solrhome/collection1/
    cd conf/

     

    编辑 schema.xml  添加如下配置:

        <!-- text_ik -->
        <fieldType name="text_ik" class="solr.TextField">
            <analyzer type="index" useSmart="false"
                class="org.wltea.analyzer.lucene.IKAnalyzer" />
            <analyzer type="query" useSmart="true"
                class="org.wltea.analyzer.lucene.IKAnalyzer" />
        </fieldType>

    保存后 重启 tomcat 浏览器查看:

    11):dataimport 导入数据库数据  连接 mysql 

    solr 默认是没有开启dataimport这个功能的,所以我们要经过一点配置来开启它。

    11-1):找到不要的 jar 文件  及 mysql 驱动jar (所需要的的文件 我会单独提出来  文章头部有下载链接)

    cd /opt/solr/install/solr-4.10.3/dist/

    把这个三个 JAR 复制到 tomcat/webapp/solr/WEB-INF/lib/ 下。

    11-2):找到 solr-4.10.3/example/example-DIH/solr/db/conf/db-data-config.xml,把其复制到  solrHome/core1/conf/下,并改名为data-config.xml.

    11-3):找到solrHome/core1/conf/solrconfig.xml,并打开,在里面添加一段内容,如下

    <requestHandler name="/dataimport" class="solr.DataImportHandler">
          <lst name="defaults">
                <str name="config">data-config.xml</str>
          </lst>
      </requestHandler>

    11-4):打开并编辑data-config.xml,完整的配置文件如下

    <dataConfig>
        <dataSource dataSource="data_source"
                driver="com.mysql.jdbc.Driver"
                    url="jdbc:mysql://IP:3306/db-solr?serverTimezone=UTC&amp;characterEncoding=utf8&amp;useUnicode=true&amp;useSSL=false"
                    user="admin"
                    password="admin" />
        <document>
            <!-- name属性,就代表着一个文档,可以随便命名 -->
            <!-- 
                transformer 格式转化:HTMLStripTransformer 索引中忽略HTML标签
                query:查询数据库表符合记录数据 query是一条sql,代表在数据库查找出来的数据
                deltaQuery:增量索引查询主键ID  注意这个只能返回ID字段
                deletedPkQuery:增量索引删除主键ID查询 注意这个只能返回ID字段 deletedPkQuery="select id from meta_solr where 1=1 and isDeleted=1"
                deltaImportQuery:增量索引查询导入的数据 
              
            -->
           <!--deletedPkQuery="select id from students  where del_flag=0"-->
            <entity name="students"
                    pk="id"
                    query="select id,carded,name,sex,telePhone,fraction,schools,familyAddress,arrangement,college,major,del_flag as delFlag
                            ,DATE_FORMAT(create_time,'%Y-%m-%d %H:%i:%S') as createTime,DATE_FORMAT(update_time,'%Y-%m-%d %H:%i:%S') as updateTime from students where del_flag=0"
                    deltaQuery="select id from students where update_time > '${dataimporter.last_index_time}'"               
                    deletedPkQuery="select id from students  where del_flag=1"               
                    deltaImportQuery="select id,carded,name,sex,telePhone,fraction,schools,familyAddress,arrangement,college,major,del_flag as delFlag
                                      ,DATE_FORMAT(create_time,'%Y-%m-%d %H:%i:%S') as createTime,DATE_FORMAT(update_time,'%Y-%m-%d %H:%i:%S') as updateTime from students  where id='${dih.delta.id}'" >
           
                <!-- 每一个field映射着数据库中列与文档中的域,column是数据库列,name是solr的域(必须是在  managed-schema 或 schema 文件中配置过的域才行 版本的不同文件名有区别 4版本是 schema) -->
                <field column="id" name="id"/>
                <field column="carded" name="carded"/>
                <field column="name" name="name"/>           
                <field column="sex" name="sex"/>
                <field column="telePhone" name="telePhone"/>
                <field column="fraction" name="fraction"/>
                <field column="schools" name="schools"/>
                <field column="familyAddress" name="familyAddress"/>           
                <field column="arrangement" name="arrangement"/>
                <field column="college" name="college"/>
                <field column="major" name="major"/>
                <field column="delFlag" name="delFlag"/>
                <field column="createTime" name="createTime"/>
                <field column="updateTime" name="updateTime"/>
    
            </entity>
        </document>
    </dataConfig>

    schema.xml 必须要配置 field:要有对应关系

       <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
       <!--测试用例-->
       <field name="carded" type="string" indexed="true" stored="true"/>
       <field name="name" type="string" indexed="true" stored="true"/>
       <field name="sex" type="string" indexed="true" stored="true"/>
       <field name="telePhone" type="string" indexed="true" stored="true"/>
       <field name="fraction" type="int" indexed="true" stored="true"/>
       <field name="schools" type="text_ik" indexed="true" stored="true"/>
       <field name="familyAddress" type="text_ik" indexed="true" stored="true"/>
       <field name="arrangement" type="string" indexed="true" stored="true"/>
       <field name="college" type="string" indexed="true" stored="true"/>
       <field name="major" type="string" indexed="true" stored="true"/>
    
       <field name="delFlag" type="string" indexed="true" stored="true"/>
       <field name="createTime" type="string" indexed="true" stored="true"/>
       <field name="updateTime" type="string" indexed="true" stored="true"/>

    重启tomcat,然后会看到如下页面

    点击蓝色的按钮,则开始导入,导入过程依据数量量的大小,需要的时间也不同,可以点击右边的Refresh status来刷新状态,可以查看当前导入了多少条。

    导入成功如下:

    12):mysql 数据发生变更 同步 solr 配置:

    方案一:使用 solr 配置定时器进行 增量更新

    方案二:使用 spring定时器等技术 调用接口进行增量更新

    方案三:使用脚本定时 进行增量更新

    12-1):打开tomcat下面solr的web.xml配置文件,路径:/usr/local/solr/tomcat/apache-tomcat-7.0.30/webapps/solr/WEB-INF 添加如下内容:

    <!-- solr数据导入监听器 -->
      <listener>
            <listener-class>
             org.apache.solr.handler.dataimport.scheduler.ApplicationListener
            </listener-class>
      </listener>

    12-2):导入相关jar 到 solr/tomcat/apache-tomcat-7.0.30/webapps/solr/WEB-INF/lib

    提示:

      solr 4.10.3 :所需要的jar为  apache-solr-dataimportscheduler-1.0.jar  其他则报错

      其他高版本的可能要重新编译源代码 重新生成jar包  

      这是个 solr 的 bug

    导入完jar文件后还需要添加如下配置:

      在solrhome目录下,新建配置文件: mkdir conf文件夹,并在conf中新建mkdir dataimport.properties文件,

      注意,一定要在solrhome目录下,以solr实例core1要在同级目录,并在dataimport.properties添加以下内容:

    #################################################
    #                                               #
    #       dataimport scheduler properties         #
    #                                               #
    #################################################
     
    #  to sync or not to sync 是否同步功能
    #  1 - active; anything else - inactive 1 - 开启; 否则不开启
    syncEnabled=1
    #  which cores to schedule
    #  in a multi-core environment you can decide which cores you want syncronized
    #  leave empty or comment it out if using single-core deployment
    #syncCores=game,resource 需要同步的solr core
    syncCores=collection1
    #  solr server name or IP address solr server 名称或IP地址
    #  [defaults to localhost if empty] 默认为localhost
    server=localhost
    #  solr server port solr server端口
    #  [defaults to 80 if empty] 默认为80
    #  安装solr的tomcat端口,如果你使用的是默认的端口,就不用改了,否则改成自己的端口就好了
    port=8081
    #  调度区间
    #  默认为30分钟
    interval=1
    #  application name/context
    #  [defaults to current ServletContextListener's context (app) name]
    webapp=solr
    #  URL params [mandatory]
    #  remainder of URL
    params=/dataimport?command=delta-import&clean=false&commit=true
    #  schedule interval
    #  number of minutes between two runs
    #  [defaults to 30 if empty]
    #  重做索引的时间间隔,单位分钟,默认7200,即5天; 
    #  为空,为0,或者注释掉:表示永不重做索引
    reBuildIndexInterval=1
     
    #  重做索引的参数
    reBuildIndexParams=/dataimport?command=full-import&clean=true&commit=true
     
    #  重做索引时间间隔的计时开始时间,第一次真正执行的时间=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;
    #  两种格式:2012-04-11 03:10:00 或者  03:10:00,后一种会自动补全日期部分为服务启动时的日期
    reBuildIndexBeginTime=03:10:00

    正常情况下:重启tomcat,然后再数据库添加一条数据,就可以在solr后台查询到添加的结果了

    但是在 solr.4.10.3  版本当中发现并不生效 也可能是我才疏学浅 。

    如有大佬发现此问题的原因:麻烦在留言区留言纠正  感谢。

    建议使用高版本 solr。

    针对上述定时更新不生效问题;本人采用 spring定时任务调度方案替代。

    package cn.com.solr.utils;
    
    import org.apache.solr.client.solrj.SolrRequest;
    import org.apache.solr.client.solrj.request.QueryRequest;
    import org.apache.solr.client.solrj.response.QueryResponse;
    import org.apache.solr.common.params.MapSolrParams;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class SolrBuildRequest {
    
        public static SolrRequest<QueryResponse> buildRequest(Command command, String entity) {
            Map<String, String> map = new HashMap<>();
            switch (command) {
                case DELTA_IMPORT:
                    map.put("command", "delta-import");
                    map.put("commit", "true");
                    map.put("wt", "json");
                    map.put("indent","true");
                    map.put("entity", entity);
                    map.put("verbose","false");
                    map.put("clean", "false");
                    map.put("optimize", "false");
                    map.put("index", "false");
                    map.put("debug", "false");
                    return new QueryRequest(new MapSolrParams(map));
                case FULL_IMPORT:
                    map.put("command", "full-import");
                    map.put("clean", "true");
                    map.put("commit", "true");
                    map.put("optimize", "false");
                    map.put("entity", entity);
                    map.put("index", "false");
                    map.put("debug", "false");
                    map.put("wt", "json");
                    return new QueryRequest(new MapSolrParams(map));
            }
            return null;
        }
    
    }
    SolrBuildRequest 工具类
    package cn.com.solr.utils;
    
    public enum Command {
        FULL_IMPORT,DELTA_IMPORT;
    }
    Command 枚举
    
    
  • 相关阅读:
    数据结构笔记(第三章)
    数据结构笔记(第二章)
    Java第三阶段学习(四、缓冲流)
    Java第三阶段学习(三、字符流、转换流)
    Java第三阶段学习(二、IO流--------递归,字节流Stream)
    Java学习(异常类)
    Java学习(异常类练习题)
    Java学习(JDBC java连接数据库)
    Java学习(Map接口)
    Java学习(set接口、HashSet集合)
  • 原文地址:https://www.cnblogs.com/codingmode/p/12660793.html
Copyright © 2020-2023  润新知