• Solr数据索引


      使用Solr最大的特点就是可以方便的与数据库直接进行索引数据的对接,即:只要配置好相应的数据库环境,就可以自定的进行数据库中数据的导入,不管如何操作,所有的数据索引操作不许有一个前提:Core存在,而所有可以使用的Core都可以直接在Solr管理控制台之中查看。

    一、MySQL与Solr整合:

    1. 要想进行数据库的连接必须配置数据库驱动,所有上传或下载数据库驱动:

    wget -P /srv/ftp/ https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.47/mysql-connector-java-5.1.47.jar

    2. 创建数据保存目录:

    mkdir -p /solr/home/contrib/dataimporthandler/lib

    3. 将mysql驱动程序移动到此目录之中:

    mv /srv/ftp/mysql-connector-java-5.1.47.jar /solr/home/contrib/dataimporthandler/lib/

    4. 修改Solr的“solrconfig.xml”配置文件,追加一个一依赖库的引用路径:vim /solr/home/solr-core/conf/solrconfig.xml

    <lib dir="${solr.install.dir:..}/contrib/dataimporthandler/lib/" regex=".*.jar" />

    5. 启动MySQL:/usr/local/mysql/bin/mysqld_safe --user=root > /dev/null 2>&1 &

    6. 用客户端连接数据库:mysql -h127.0.0.1 -uroot -p123456

    7. 进行数据测试:

    DROP DATABASE IF EXISTS yootk_shop;
    CREATE DATABASE yootk_shop CHARACTER SET UTF8 ;
    USE yootk_shop ;
    CREATE TABLE goods(
        gid            BIGINT        AUTO_INCREMENT ,
        name        VARCHAR(50) ,
        catalog        VARCHAR(50) ,
        provider     VARCHAR(50) ,
        price        DOUBLE ,
        note        TEXT ,
        photo        VARCHAR(50) ,
        recdate        datetime    default now() ,
        isdelete    int default 0 ,
        CONSTRAINT pk_gid PRIMARY KEY(gid) 
    ) engine=innodb ;
    INSERT INTO goods (name,catalog,provider,price,note,photo) VALUES ('小强灭','杀虫剂','宝洁',1.1,'直接杀死,不留后患','nophoto.jpg') ;
    INSERT INTO goods (name,catalog,provider,price,note,photo) VALUES ('保鲜膜','厨房用品','宝洁',9.8,'让食物保持新鲜','nophoto.jpg') ;
    SELECT gid,name,catalog,provider,price,note,photo,recdate,isdelete FROM goods ;

    二、数据导入:

    1. 转换操作的核心在于数据的的配置文件上,那么现在假设这个配置文件名称为“data-config.xml”文件,于是在相应的core目录里面进行此文件的创建:

      vim /solr/home/solr-core/conf/data-config.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <dataConfig>
        <!-- 建立数据库连接的数据源 -->
        <dataSource name="yootkDataSource" 
            driver="com.mysql.jdbc.Driver" 
            url="jdbc:mysql://192.168.28.226:3306/yootk_shop" 
            user="root" password="123456"/>
        <document>
            <!-- 建立具体的数据索引实体配置 -->
            <entity name="goods" dataSource="yootkDataSource"
                query="SELECT gid,name,catalog,provider,price,note,photo,recdate,isdelete FROM goods">
                <!-- 定义索引成员,其中column为字段名称,name为索引名称 -->
                <field column="gid" name="id"/>    <!-- solr索引名称必须为id -->
                <field column="name" name="solr_name"/>
                <field column="catalog" name="solr_catalog"/>
                <field column="provider" name="solr_provider"/>
                <field column="price" name="solr_price"/>
                <field column="note" name="solr_note"/>
                <field column="photo" name="solr_photo"/>
                <field column="recdate" name="solr_recdate"/>
                <field column="isdelete" name="solr_isdelete"/>
            </entity>
        </document>
    </dataConfig>

    2. 对于Solr服务器并不知道这样一个配置文件的存在,所以就必须在“solrconfig.xml”配置文件里面进行此文件的名称的定义:vim /solr/home/solr-core/conf/solrconfig.xml

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

    3. 通过data-config.xml文件只是实现了Solr索引文件与数据表字段之间的映射处理,但是Solr本身并不认识这些文件内容,那么嗨需要一个核心配置文件:

      vim /solr/home/solr-core/conf/managed-schema

      》添加位置,添加在“<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />”前面:

        将solr的所有索引字段的名称在此文件之中进行定义,以及对应的类型的基本配置:

    <field name="solr_name" type="string" indexed="true" stored="true" required="true" multiValued="false" />
    <field name="solr_catalog" type="string" indexed="true" stored="true" required="true" multiValued="false" />
    <field name="solr_provider" type="string" indexed="true" stored="true" required="true" multiValued="false" />
    <field name="solr_price" type="pfloat" indexed="true" stored="true" required="true" multiValued="false" />
    <field name="solr_note" type="string" indexed="true" stored="true" required="true" multiValued="false" />
    <field name="solr_photo" type="string" indexed="true" stored="true" required="true" multiValued="false" />
    <field name="solr_recdate" type="pdate" indexed="true" stored="true" required="true" multiValued="false" />
    <field name="solr_isdelete" type="pint" indexed="true" stored="true" required="true" multiValued="false" />

    4. 配置完成,重启Tomcat:

    /usr/local/tomcat/bin/catalina.sh stop
    /usr/local/tomcat/bin/catalina.sh start

    5. 利用管理控制台实现数据的导入配置,导入成功好要想确定数据已经存在于索引库之中,可以执行数据的查询处理

     三、 索引增量:

      现在数据表中的数据已经全部都在Solr之中进行了索引库的创建,那么这个时候如果用户检索的时候肯定检索的就是索引库中的数据内容,于是就有可能出现索引库与数据表之间数据不匹配的问题,那么在这样的处理环境下,就需要进行增量索引的配置,让其可以进行更加有效的数据同步处理。

    1. 先数据库中添加内容:

    INSERT INTO goods (name,catalog,provider,price,note,photo) VALUES ('马老二熏肉','食品','马黑房',9.9,'吃了就变黑娃娃','nophoto.jpg') ;
    INSERT INTO goods (name,catalog,provider,price,note,photo) VALUES ('擦地宝','厨房用品','宝洁',9.8,'让食物保持新鲜','nophoto.jpg') ;
    INSERT INTO goods (name,catalog,provider,price,note,photo) VALUES ('小辛娃娃','厨房用品','宝洁',1.8,'自动刷碗','nophoto.jpg') ;

      此时的数据只在数据库中进行了存储,所以Solr索引库中不会存在有相应的索引信息,那么在这样的情况下,如果没有进行任何配置的话,只能够使用全部导入操作(索引库清空,随后进行索引库的重新创建),所以必须进一步进行Solr的配置,使其增量处理生效。

    2. 所以数据表与索引字段之间的映射转换都在“data-config.xml”配置文件之中进行了详细的定义,那么对于增量的配置处理也需要在这个文件里面进行操作:

      vim /solr/home/solr-core/conf/data-config.xml 

    <?xml version="1.0" encoding="UTF-8"?>
    <dataConfig>
        <!-- 建立数据库连接的数据源 -->
        <dataSource name="yootkDataSource" 
            driver="com.mysql.jdbc.Driver" 
            url="jdbc:mysql://192.168.195.153:3306/yootk_shop" 
            user="root" password="mysqladmin"/>
        <document>
            <!-- 建立具体的数据索引实体配置 -->
            <entity name="goods" dataSource="yootkDataSource"
                query="SELECT gid,name,catalog,provider,price,note,photo,recdate,isdelete FROM goods"
                deltaImportQuery="SELECT gid,name,catalog,provider,price,note,photo,recdate,isdelete FROM goods WHERE gid='${dataimporter.delta.gid}'"
                deltaQuery="SELECT gid FROM goods WHERE recdate>'${dataimporter.last_index_time}'"
                deletedPkQuery="SELECT gid FROM goods WHERE isdelete=1">
                <!-- 定义索引成员,其中column为字段名称,name为索引名称 -->
                <field column="gid" name="id"/>    <!-- solr索引名称必须为id -->
                <field column="name" name="solr_name"/>
                <field column="catalog" name="solr_catalog"/>
                <field column="provider" name="solr_provider"/>
                <field column="price" name="solr_price"/>
                <field column="note" name="solr_note"/>
                <field column="photo" name="solr_photo"/>
                <field column="recdate" name="solr_recdate"/>
                <field column="isdelete" name="solr_isdelete"/>
            </entity>
        </document>
    </dataConfig>

      此时在“<entity>”元素之中追加了如下的新的配置:

        》“deltaImportQuery”:明确描述的是进行了增量导入的查询配置;

        》“deltaQuery”:进行增量的查询,超过了最后一次导入记录日期的都是增量(recdate);

        》“deletedPkQuery”:定义了需要删除主键的查询操作(逻辑删除);

    3. 配置完成,重新起订Tomcat:

    /usr/local/tomcat/bin/catalina.sh stop
    /usr/local/tomcat/bin/catalina.sh start

    4. 为了更加方便的进行索引增量的演示,可以考虑将数据表的内容重置;

    5. 在浏览器之中首先进行索引的全部导入,导入完成之后会有一个导入的属性文件:cat /solr/home/solr-core/conf/dataimport.properties

      由于此时已经进行了增量导入配置操作,所以在此执行增量导入的时候会发现该操作已经可以正常执行完毕。

  • 相关阅读:
    [VirtaulBox]网络连接设置
    LeetCode
    LeetCode
    LeetCode
    LeetCode-37.Sudok Solver
    LeetCode-36.Valid Sudoku
    LeetCode-52.N-Queen II
    LeetCode-51.N-Queens
    LeetCode-22.Generate Parentheses
    LeetCode-111.Mininum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/luliang888/p/11154165.html
Copyright © 2020-2023  润新知