美文网首页分布式already收藏
分布式--solr搜索引擎

分布式--solr搜索引擎

作者: aruba | 来源:发表于2022-07-13 14:32 被阅读0次

    一、简介

    搜索是项目中常用的功能,对于大数据量的搜索,查询关系型数据库是非常低效的,好在有三方专门用于搜索的工具,常用的搜索解决方案为:

    • 基于Apache Lucene实现
    • 基于百度API实现
    • 基于谷歌API实现

    solr基于Lucene实现,本质是一个Java Web项目,并集成了Jetty服务器,Jetty和Tomcat差不多,也是一个JavaWeb容器,我们客户端只需要通过调用solr控制器,solr处理完后返回数据

    反向索引

    搜索使用反向索引将大大提高搜索效率,正向索引与反向索引的区别如下:

    • 正向索引:将查找内容分词,后根据分词完的词组,挨个进行搜索:
    • 反向索引:内容存入数据源的同时进行分词,搜索时直接根据词组搜索:

    solr搜索原理

    solr就是利用了反向索引,将搜索内容分词后,直接和存储内容的索引进行匹配:

    solr拥有自己的数据库,以Document作存储

    二、solr安装

    前面提到过solr是Java Web项目,所以需要先装好JDK
    官网下载:https://solr.apache.org/downloads.html

    1. 解压

    下载传入服务器后,解压:

    tar xvf solr-8.11.2.tgz
    

    2. 移动

    移动到/usr/local目录下:

    mv ./solr-8.11.2 /usr/local/
    

    3. 修改启动参数

    cd /usr/local/solr-8.11.2/bin/
    vi solr.in.sh
    

    找到SOLR_ULIMIT_CHECKS并修改:

    SOLR_ULIMIT_CHECKS=false
    

    4. 启动solr

    如果是root用户,需要加上-force

    ./solr start -force
    

    启动成功:

    三、可视化管理界面

    访问服务器8983端口可以进入solr的可视化管理界面:

    1. 整体信息
    2. 日志
    3. 安全性相关
    4. 核心。类似数据库DataBase
    5. Java信息
    6. 线程相关
    7. 如果有核心,将在此处显示

    四、创建核心

    solr安装完后,直接在界面上添加核心会报错,需要进行一些配置

    1. 复制配置文件

    cd /usr/local/solr-8.11.2/server/solr
    mkdir test_core
    cp -r configsets/_default/conf/ test_core/
    

    2. 创建核心

    instanceDir需要和上面创建的文件夹名一致,确认信息后,点击Add Core

    等待创建结束后,下方就可以选择核心了:

    四、中文分词配置

    solr默认对中文只会按照每个字进行分词:

    如果想要获得中文较好的支持,需要使用ik-analyzer.jar包,下载地址:https://search.maven.org/search?q=com.github.magese,注意对应solr大版本

    1. 导入jar

    将下载完后传入服务器,并移动到/usr/local/solr-8.11.2/server/solr-webapp/webapp/WEB-INF/lib目录下:

     mv ik-analyzer-8.5.0.jar  /usr/local/solr-8.11.2/server/solr-webapp/webapp/libs/
    

    2. 修改配置文件

    上面提到solr使用Document存储,Document包含的属性和属性类型都定义在managed-schemel中,争对中文的分词,我们需要自定义一个属性并赋予它类型

    编辑对应核心的managed-schemel文件,/usr/local/solr-8.11.2/server/solr/test_core/conf目录下:

    cd /usr/local/solr-8.11.2/server/solr/test_core/conf
    vi managed-schema
    
    2.1 添加属性

    schema标签包裹区域内添加:

        <!--定义属性,type表示属性类型 indexed表示是否建立索引  stored表示是否显示给用户-->
        <field name="_china_" type="text_ik" indexed="true" stored="true" />
    
    2.2 添加属性类型

    和刚刚导入的jar包进行关联:

        <fieldType name="text_ik" class="solr.TextField">
                <analyzer type="index">
                        <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
                        <filter class="solr.LowerCaseFilterFactory"/>
                </analyzer>
                <analyzer type="query">
                        <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
                        <filter class="solr.LowerCaseFilterFactory"/>
                </analyzer>
        </fieldType>
    

    3. 重启solr

    cd /usr/local/solr-8.11.2/bin
    ./solr stop -all
    ./solr start -force
    

    在界面上使用_china_进行分词:

    4. managed-schema说明

    标签 属性 描述
    < fieldType/> 定义属性类型
    < field/> 定义属性
    name 属性名称
    type 属性的类型
    indexed 该属性是否建立索引,即可以通过分词的词组被查找
    stored 该属性是否需要返回给搜索用户,并不是所有属性都要展示
    required 该属性是否必须
    multiValued 该属性是否为复合属性,即属性中还有其他属性
    < copyField/> multiValued搭配使用,用于表示符合属性中使用的多个属性
    source 指定关联的属性名
    dest 指定复合属性名
    < uniqueKey/> 唯一主键属性
    < dynamicField/> 定义动态属性,name通过通配符进行配置,可以表示多个属性

    五、DataImport

    接着我们将本地数据库中的数据导入到solr中,使用的是solr的dataimport,将dept部门表数据导入,SQL的创建在MyBatis--初入MyBatis中可以找到

    1. 准备属性

    managed-schema中定义与本地数据库字段相对应的属性:

    cd /usr/local/solr-8.11.2/server/solr/test_core/conf
    vi managed-schema
    

    默认的一些属性类型可以在界面中查找:

    部门表对应的属性:

        <field name="deptno" type="pint" indexed="false" stored="true"/>
        <field name="dname" type="text_general" indexed="true" stored="true"/>
        <field name="loc" type="text_ik" indexed="true" stored="true"/> 
    

    2. 新建配置文件

    在同一个目录下新建配置文件,用于连接数据库以及做数据库字段和属性的映射:

    vi data-dept.xml
    

    内容为:

    <?xml version="1.0" encoding="UTF-8"?>
    <dataConfig>
            <dataSource type="JdbcDataSource"
                    driver="com.mysql.jdbc.Driver"
                    url="jdbc:mysql://192.168.42.170:3306/mydb?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai&amp;tinyInt1isBit=false"
                    user="root"
                    password="root"/>
            <document>
                <entity name="dept" query="select * from dept">
                    <!--
                     实现数据库的列和索引库的字段的映射
                     column 指定数据库的列表
                     name  指定索引库的字段名字,必须和managed-schema中定义的一样
                     -->
                     <field column="deptno" name="deptno"/>
                     <field column="dname" name="dname"/>
                     <field column="loc" name="loc"/>
                </entity>
             </document>
    </dataConfig>
    

    3. 配置solrconfig.xml

    vi solrconfig.xml
    

    config标签包裹中添加DataImport的使用:

     <!-- 配置数据导入的处理器 -->
      <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
        <lst name="defaults">
          <!--  加载data-dept.xml  -->
          <str name="config">data-dept.xml</str>
         </lst>
      </requestHandler>
    

    4. 导入jar包

    还需要将两个jar包导入到\WEB-INF\lib目录中:

    cd /usr/local/solr-8.11.2/dist
    cp solr-dataimporthandler-* /usr/local/solr-8.11.2/server/solr-webapp/webapp/WEB-INF/lib
    

    以及mysql的数据库驱动,下载后上传到服务器,再移动到\WEB-INF\lib目录中:

    cp mysql-connector-java-8.0.29.jar /usr/local/solr-8.11.2/server/solr-webapp/webapp/WEB-INF/lib
    

    5. 重启solr并导入数据

    cd /usr/local/solr-8.11.2/
    ./solr stop -all
    ./solr start -force
    

    界面上点击执行:

    如果出错,可以查看/usr/local/solr-8.11.2/server/logs/solr.log的日志:

    tail -f solr.log
    

    我这边遇到的是mysql连接不上,修改mysql的user表,将root用户Host改为%

    查询下数据,发现已经导入了:

    六、solr集群搭建

    solr内置了集群功能,是基于zookeeper实现的,启动集群非常便利

    1. 开启集群

    执行开启集群命令,可以使用-noprompt表示默认配置:

    ./solr -e cloud [-noprompt] -force
    

    完成后,会创建两个node目录:

    2. 重启

    ./solr start -c -p 8983 -s ../example/cloud/node1/solr/ -force
    ./solr start -c -p 7574 -z localhost:9983 -s ../example/cloud/node2/solr/ -force
    

    相关文章

      网友评论

        本文标题:分布式--solr搜索引擎

        本文链接:https://www.haomeiwen.com/subject/bmzobrtx.html