侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130562 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

Solr6.5 集群搭建、数据库数据导入solr、分词器配置

2023-11-11 星期六 / 0 评论 / 0 点赞 / 56 阅读 / 19552 字

准备:solr 6.5、tomcat8、jdk1.8、zookeeper3.4.6 注:这里是以伪集群方式搭建,即在同一个机器上面部署三个solr节点,组成cloud, 环境是MacOSX , 其它系

准备:solr 6.5、tomcat8、jdk1.8、zookeeper3.4.6

注:这里是以伪集群方式搭建,即在同一个机器上面部署三个solr节点,组成cloud,  环境是MacOSX , 其它系统操作步骤差不多,这里的当前目录是/Users/vincent/dev/solrcloud

1> . 前置条件, 装好jdk8环境,解压一个tomcat8,并指定上UTF-8编码,方便后面做模板.
2> . 搭建zookeeper集群:

          这里不介绍怎么搭建,非常简单,搭建完记得测试验证,确保没有问题。zookeeper伪集群搭建如下:  
          localhost:2281,localhost:2381,localhost:2481
3> . 搭建solrcloud
       Tomcat8部署:

       分别为tomcat1 , tomcat2 , tomcat3 , 对应端口分别为:8081、8082、8083 ,部署三份时一定注意修改端口,不要冲突
       创建solr数据存储目录:
            分别为solr_home_1、solr_home_2、solr_home_3 ;
            将solr-6.5.1/server/solr下的solr.xml与zoo.cfg分别拷到solr_hom1、solr_home_2、solr_home3当中;
            将solr_home_1/solr.xml将里面的端口改为8081 ;
            将solr_home_2/solr.xml将里面的端口改为8082 ;
            将solr_home_3/solr.xml将里面的端口改为8083;
        部署solr节点服务:
            将solr-6.5.0/server/solr-webapp中的web分别拷到tomcat1、tomcat2、tomcat3的webapp下,并将web名字修改为solr;
            将solr-6.5.0/server/lib/ext下所有jar包分别拷到tomcat1、tomcat2、tomcat3下面webapps的solr项目的lib目录中;
            将solr-6.5.0/server/lib下metrics-相关的jar包分别拷到tomcat1、tomcat2、tomcat3下面webapps的solr项目的lib目录中;
            将solr-6.5.0/server/resources 下log4j.properties分别拷到tomcat1、tomcat2、tomcat3下面webapps的solr项目下的classes文件夹中,classes得创建;
            修改tomcat1、tomcat2、tomcat3当中webapps/solr/WEB-INF/classes/log4j.properties文件,修改solr.log参数:
               tomcat1 : solr.log=/Users/vincent/dev/solrcloud/tomcat1/logs
               tomcat2: solr.log=/Users/vincent/dev/solrcloud/tomcat2/logs
               tomcat3: solr.log=/Users/vincent/dev/solrcloud/tomcat3/logs
         配置web.xml指定solrhome的位置:
              打开三个tomcat下的solr的web.xml,将下图中的部分去掉注释,并将自己的solrhome地址加到配置文件中,分别对应的是上面创建solr_home_1、solr_home_2、solr_home_3。
                               
               解决访问solr报403的错误,分别修改三个tomcat当中solr项目中的web.xml,将169行左右的security-constraint代码注释掉
                
        若出现404错误,连接地址改为localhost:8080/solr/index.html试试
4>. 创建集群配置文件目录
       创建config-files目录
       将 solr-6.0.0/server/solr/configsets/data_driven_schema_configs/conf目录下的所有文件拷贝到 /Users/vincent/dev/solrcloud/config-files下
       将 solr-6.0/solr-6.0.0/example/example-DIH/solr/db/conf下的admin-extra.html, admin-extra.menu-bottom.html ,admin-extra.menu-top.html三个文件也复制到/Users/vincent/dev/solrcloud/config-files下
       将 solr-6.0/solr-6.0.0/dist下的solr-dataimporthandler-6.0.0.jar和solr-dataimporthandler-extras-6.0.0.jar都复制到tomcat1、tomcat2、tomcat3的webapps/solr/WEB-INF/lib/下
       将mysql驱动包复制到tomcat1、tomcat2、tomcat3的webapps/solr/WEB-INF/lib/下,用于后面数据库数据导入solr , 如果是其它数据库,则拷对应驱动包

5>. 配置分词器
        solr自带中文分词:

            复制solr-6.5.0/contrib/analysis-extras/lucene-libs/lucene-analyzers-smartcn-6.5.0.jar到tomcat1、tomcat2、tomcat3的webapps/solr/WEB-INF/lib/下
            编辑/Users/vincent/dev/solrcloud/config-files/managed-schema ,在</schema>前添加以下内容:
                <!-- solr默认中文分词 -->
                <fieldType name="text_smartcn" class="solr.TextField" positionIncrementGap="0">
                        <analyzer type="index">
                             <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
                        </analyzer>
                        <analyzer type="query">
                           <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
                        </analyzer>
                </fieldType>

          ikanalyzer分词:
              先准备ik jar包及字典文件:ext.dic  IKAnalyzer.cfg.xml  solr-analyzer-ik-5.1.0.jar ik-analyzer-solr5-5.x.jar  stopword.dic
              ext.dic为扩展字典,stopword.dic为停止词字典,IKAnalyzer.cfg.xml为配置文件,solr-analyzer-ik-5.1.0.jar ik-analyzer-solr5-5.x.jar为分词jar包。
             将文件夹下的IKAnalyzer.cfg.xml , ext.dic和stopword.dic 三个文件 复制到tomcat1、tomcat2、tomcat3的/webapps/solr/WEB-INF/classes 目录下,并修改IKAnalyzer.cfg.xml
              <?xml version="1.0" encoding="UTF-8"?>
                <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
                <properties>
                    <comment>IK Analyzer 扩展配置</comment>
                    <!--用户可以在这里配置自己的扩展字典 -->
                    <entry key="ext_dict">ext.dic;</entry>
                    <!--用户可以在这里配置自己的扩展停止词字典-->
                    <entry key="ext_stopwords">stopword.dic;</entry>
                </properties>

          复制solr-analyzer-ik-5.1.0.jar ik-analyzer-solr5-5.x.jar到tomcat1、tomcat2、tomcat3的webapps/solr/WEB-INF/lib/下
          编辑/Users/vincent/dev/solrcloud/config-files/managed-schema ,在</schema>前添加以下内容:
                <!-- 我添加的IK分词 -->
                <fieldType name="text_ik" class="solr.TextField">
                    <analyzer type="index">
                        <tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="true"/>
                    </analyzer>
                    <analyzer type="query">
                        <tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="true"/>
                    </analyzer>
                </fieldType>

          拼英分词:
            前期准备,需要用到pinyin4j-2.5.0.jar、pinyinAnalyzer.jar这两个jar包
            将pinyin4j-2.5.0.jar、pinyinAnalyzer.jar这两个jar到tomcat1、tomcat2、tomcat3的webapps/solr/WEB-INF/lib/下
            编辑/Users/vincent/dev/solrcloud/config-files/managed-schema ,在</schema>前添加以下内容:
            <fieldType name="text_pinyin" class="solr.TextField" positionIncrementGap="0">
                <analyzer type="index">
                    <tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory"/>
                    <filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLenght="2" />
                    <filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="1" maxGram="20" />
                </analyzer>
                <analyzer type="query">
                    <tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory"/>
                    <filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLenght="2" />
                    <filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="1" maxGram="20" />
                </analyzer>
            </fieldType>

        
6>. 配置集群
       修改tomcat1/bin/catalina.sh文件, 找到CLASSPATH=关键字这一行,在其下面加入,注意,这里core名为xjh
       JAVA_OPTS="$JAVA_OPTS -Dbootstrap_confdir=/Users/vincent/dev/solrcloud/config-files -Dcollection.configName=xjh -DzkHost=localhost:2281,localhost:2381,localhost:2481"
       修改tomcat2与tomcat3的bin/catalina.sh文件, 找到CLASSPATH=关键字这一行,在其下面加入
      JAVA_OPTS="$JAVA_OPTS -DzkHost=localhost:2281,localhost:2381,localhost:2481"
       
7>. 测试难证
       理论上按上面的步骤操作完,solrcloud6.5集群就搭建好了,分别访问测试验证下:
        http://localhost:8081/solr/index.html
        http://localhost:8082/solr/index.html
        http://localhost:8083/solr/index.html
        创建core, 3个solr节点,core名为xjh
        http://localhost:8081/solr/admin/collections?action=CREATE&name=xjh&numShards=1&replicationFactor=3&maxShardsPerNode=3
     
8>. 创建core
        示例:3个solr节点,core名为xjh
        http://localhost:8081/solr/admin/collections?action=CREATE&name=xjh&numShards=1&replicationFactor=3&maxShardsPerNode=3

        配置collection.示例如下:
        创建接口:http://192.168.1.110:81/solr/admin/collections?action=CREATE&name=survey&numShards=2&replicationFactor=2&maxShardsPerNode=2
        删除接口:http://localhost:81/solr/admin/collections?action=DELETE&name=survey
        重新加载接口:http://localhost:8983/solr/admin/collections?action=RELOAD&name=survey
        分割碎片接口:http://localhost:8983/solr/admin/collections?action=SPLITSHARD&collection=&lt;collection_name&gt;&shard=shardId
        创建别名:http://localhost:8983/solr/admin/collections?action=CREATEALIAS&name=alias&collections=collection1,collection2,…
        移除存在的别名:http://localhost:8983/solr/admin/collections?action=DELETEALIAS&name=alias

        参数名说明
            name:collection的名称
            numShards:指定分片数量(slices)
            replicationFactor:指定每个Shard副本数量
            maxShardsPerNode:默认值为1,注意三个数值:numShards、replicationFactor、liveSolrNode,
             一个正常的solrCloud集群不容许同一个liveSolrNode上部署同一个shard的多个replic,
             因此当maxShardsPerNode=1时,numShards*replicationFactor>liveSolrNode时,报错。因此正确时因满足以下条件:
            createNodeSet:如果不提供该参数,创建操作将创建碎片副本展开分布到所有活跃的 Solr 节点上。提供该参数改变用于创建碎片副本的节点集合
            collection.configName:指定该collection使用那份config,这份config必须存在于zk中。

至此,集群搭建完毕

映射索引document对象关系:
编辑/Users/vincent/dev/solrcloud/config-files/managed-schema , 配置索引document对象映射关系:
找到“<schema name=”这一行,改为<schema name="xjh” 
映射字段关系:注意id字段保留
    <field name="goods_name" type="text_ik" indexed="false" stored="true"/>
    <field name="brand_name" type="text_pinyin" indexed="false" stored="true" />
    <field name="word" type="text_smartcn" indexed="false" stored="true"/>
    <field name="gkey" type="text_smartcn" indexed="false" stored="true"/>

    <!-- 定义一个字段来包含所有可搜索的字段 (通过copyField 实现)  -->
    <field name="keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/> 

配置数据库导入数据:
前提:
    在mysql当中创建一张go_item_t表,建表语句如下:
    create table go_item_t(    
        item_id varchar(19) primary key not null,
        goods_name varchar(500),
        brand_name varchar(100),
        word varchar(50),
        gkey varchar(50)
    );

   添加一些数据到表里面,方便后面的测试

 编辑 /Users/vincent/dev/solrcloud/config-files/solrconfig.xml文件,
 在solrconfig.xml文件里<requestHandler name="/select" class="solr.SearchHandler"> 上面添加  配置
        <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
          <lst name="defaults">
             <str name="config">data-config.xml</str>
          </lst>
       </requestHandler>

在 /Users/vincent/dev/solrcloud/config-files目录下创建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/test"
              user="root"
              password="root"/>
  <document>
    <entity name="contract" query="select item_id,goods_name,brand_name,word,gkey from go_item_t ">
        <field column = "item_id" name= "id" />
        <field column = "goods_name" name = "goods_name" />
        <field column = "brand_name" name = "brand_name" />
        <field column = "word" name = "word" />
        <field column = "gkey" name = "gkey" />
    </entity>
  </document>
</dataConfig>

访问solr节点1,选择core里面的Dataimport ,  点击Execute , 如果不报错,应该就成功的将数据库当中的数据导入了solr

再query验证下,数据已进来

广告 广告

评论区