zoukankan      html  css  js  c++  java
  • 使用Solr索引MySQL数据

    参看文献:https://www.cnblogs.com/luxiaoxun/p/4442770.html

    版本:solr-5.3.0

    1、创建core或collection:bin/solr create -c collection3

    solr-5.0 以上默认对schema的管理是使用managed-schema,不能手动修改,需要使用Schema Restful的API操作。如果要想手动修改配置,把managed-schema拷贝一份修改为schema.xml,在solrconfig.xml中修改如下:

    <!-- <schemaFactory class="ManagedIndexSchemaFactory">
        <bool name="mutable">true</bool>
        <str name="managedSchemaResourceName">managed-schema</str>
      </schemaFactory> -->
      
    <!-- <processor class="solr.AddSchemaFieldsUpdateProcessorFactory">
          <str name="defaultFieldType">strings</str>
          <lst name="typeMapping">
            <str name="valueClass">java.lang.Boolean</str>
            <str name="fieldType">booleans</str>
          </lst>
          <lst name="typeMapping">
            <str name="valueClass">java.util.Date</str>
            <str name="fieldType">tdates</str>
          </lst>
          <lst name="typeMapping">
            <str name="valueClass">java.lang.Long</str>
            <str name="valueClass">java.lang.Integer</str>
            <str name="fieldType">tlongs</str>
          </lst>
          <lst name="typeMapping">
            <str name="valueClass">java.lang.Number</str>
            <str name="fieldType">tdoubles</str>
          </lst>
        </processor> -->
        
      <schemaFactory class="ClassicIndexSchemaFactory"/>

    创建MySQL数据

    使用DataImportHandler导入并索引数据

    G:solr-5.3.0serversolrcollection3confsolrconfig.xml

    <requestHandler name="/select" class="solr.SearchHandler">前面上加上一个dataimport的处理的Handler

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

    2) 在同目录下添加data-config.xml

    <?xml version="1.0" encoding="UTF8" ?>
    <dataConfig>
        <dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/test" user="root" password="888" batchSize="-1" />
       <document name="testDoc">
            <entity name="user" pk="id" query="select * from user"
                 deltaImportQuery="select * from user where id='${dih.delta.id}'"
                    deltaQuery="select id from user where updateTime> '${dataimporter.last_index_time}'">
             <field column="id" name="id"/>
             <field column="userName" name="userName"/>
                <field column="userAge" name="userAge"/>
                <field column="userAddress" name="userAddress"/>
                <field column="updateTime" name="updateTime"/>
         </entity>
      </document>
    </dataConfig>

    说明:

    dataSource是数据库数据源。

    Entity就是一张表对应的实体,pk是主键,query是查询语句。

    Field对应一个字段,column是数据库里的column名,后面的name属性对应着Solr的Filed的名字。

    3) 修改同目录下的schema.xml,这是Solr对数据库里的数据进行索引的模式

    1)保留_version_ 这个field

    2)添加索引字段:这里每个field的name要和data-config.xml里的entity的field的name一样,一一对应。

    3)删除多余的field,删除copyField里的设置,这些用不上。注意:text这个field不能删除,否则Solr启动失败。

    (4)设置唯一主键:<uniqueKey>id</uniqueKey>,注意:Solr中索引的主键默认是只支持type="string"字符串类型的,而我的数据库中id是int型的,会有问题,解决方法:修改同目录下的elevate.xml,注释掉下面2行,这貌似是Solr的Bug,原因不明。

    拷贝mysql-connector-java-5.1.36.jar和solr-dataimporthandler-5.3.0.jar,solr-dataimporthandler-extras-5.3.0.jar到G:solr-5.3.0serversolr-webappwebappWEB-INFlib一个是mysql的java驱动,另一个在G:solr-5.3.0dist目录里

    重启Solr。

    如果配置正确就可以启动成功。

    solrconfig.xml是solr的基础文件,里面配置了各种web请求处理器、请求响应处理器、日志、缓存等。

    schema.xml配置映射了各种数据类型的索引方案。分词器的配置、索引文档中包含的字段也在此配置。

    进入Solr主页,在Core Selector中选择collection1:http://localhost:8983/solr/#/collection3

    点击Dataimport,Command选择full-import(默认),点击“Execute”,Refresh Status就可以看到结果:

    查询:

    所搜的时候,如果要实现整词搜索则加双引号,比如 "小米手机"

    DIH增量从MYSQL数据库导入数据

    已经学会了如何全量导入MySQL的数据,全量导入在数据量大的时候代价非常大,一般来说都会适用增量的方式来导入数据,下面介绍如何增量导入MYSQL数据库中的数据,以及如何设置定时来做。

    1)数据库表的更改

    前面已经创建好了一个User的表,这里为了能够进行增量导入,需要新增一个字段updateTime,类型为timestamp,默认值为CURRENT_TIMESTAMP。

    有了这样一个字段,Solr才能判断增量导入的时候,哪些数据是新的。

    因为Solr本身有一个默认值last_index_time,记录最后一次做full import或者是delta import(增量导入)的时间,这个值存储在文件conf目录的dataimport.properties文件中。

    2)data-config.xml中必要属性的设置

    transformer 格式转化:HTMLStripTransformer 索引中忽略HTML标签

    query:查询数据库表符合记录数据

    deltaQuery:增量索引查询主键ID  注意这个只能返回ID字段   

    deltaImportQuery:增量索引查询导入的数据 

    deletedPkQuery:增量索引删除主键ID查询 注意这个只能返回ID字段   

    有关“query”,“deltaImportQuery”, “deltaQuery”的解释,引用官网说明,如下所示:
    The query gives the data needed to populate fields of the Solr document in full-import
    The deltaImportQuery gives the data needed to populate fields when running a delta-import
    The deltaQuery gives the primary keys of the current entity which have changes since the last index time

    如果需要关联子表查询,可能需要用到parentDeltaQuery

    增量索引的原理是从数据库中根据deltaQuery指定的SQL语句查询出所有需要增量导入的数据的ID号。

    然后根据deltaImportQuery指定的SQL语句返回所有这些ID的数据,即为这次增量导入所要处理的数据。

    核心思想是:通过内置变量“${dih.delta.id}”和 “${dataimporter.last_index_time}”来记录本次要索引的id和最近一次索引的时间。

    如果业务中还有删除操作,可以在数据库中加一个isDeleted字段来表明该条数据是否已经被删除,这时候Solr在更新index的时候,可以根据这个字段来更新哪些已经删除了的记录的索引。

    这时候需要在dataConfig.xml中添加:

    query="select * from user where isDeleted=0"
    deltaImportQuery="select * from user where id='${dih.delta.id}'"
    deltaQuery="select id from user where updateTime> '${dataimporter.last_index_time}' and isDeleted=0"
    deletedPkQuery="select id from user where isDeleted=1"

    测试增量导入

    如果User表里有数据,可以先清空以前的测试数据(因为加的updateTime没有值),用我的Mybatis测试程序添加一个User,数据库会以当前时间赋值给该字段。在Solr中使用Query查询所有没有查询到该值,使用dataimport?command=delta-import增量导入,再次查询所有就可以查询到刚刚插入到MySQL的值。

    设置增量导入为定时执行的任务

    可以用Windows计划任务,或者Linux的Cron来定期访问增量导入的连接来完成定时增量导入的功能,这其实也是可以的,而且应该没什么问题。

    但是更方便,更加与Solr本身集成度高的是利用其自身的定时增量导入功能。

    下载apache-solr-dataimportscheduler-1.0.jar放到solr-webappwebappWEB-INFlib目录下:

    2、修改solr的WEB-INF目录下面的web.xml文件:
    为<web-app>元素添加一个子元素

    <listener>
            <listener-class>
        org.apache.solr.handler.dataimport.scheduler.ApplicationListener
            </listener-class>
        </listener>

    3、新建配置文件dataimport.properties:

    在G:solr-5.3.0serversolr目录下面新建一个目录conf(注意不是G:solr-5.3.0serversolrcollection3下面的conf),然后用解压文件打开apache-solr-dataimportscheduler-1.0.jar文件,将里面的dataimport.properties文件拷贝过来,进行修改,下面是最终我的自动定时更新配置文件内容:

    #################################################
    #                                               #
    #       dataimport scheduler properties         #
    #                                               #
    #################################################
    
    #  to sync or not to sync
    #  1 - active; anything else - inactive
    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=collection3
    
    #  solr server name or IP address
    #  [defaults to localhost if empty]
    server=localhost
    
    #  solr server port
    #  [defaults to 80 if empty]
    port=8983
    
    #  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]
    interval=1
    
    #  重做索引的时间间隔,单位分钟,默认7200,即1天; 
    #  为空,为0,或者注释掉:表示永不重做索引
    reBuildIndexInterval=2
    
    #  重做索引的参数
    reBuildIndexParams=/select?qt=/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

     

    遇到的问题:

    1字节的UTF-8序列的字节1无效

    1.手动将<?xml version="1.0" encoding="UTF-8"?>中的UTF-8更改成UTF8

  • 相关阅读:
    GO学习-(31) Go语言操作Elasticsearch
    GO学习-(30) Go语言操作kafka
    GO学习-(29) Go语言操作etcd
    Maven+Spring打Jar包
    话说Session
    Apache Server与多个独立Tomcat集成
    一套Tomcat处理多个域名请求
    Tomcat多实例
    Linux下安装MySQL
    Java Enum
  • 原文地址:https://www.cnblogs.com/james-roger/p/8903579.html
Copyright © 2011-2022 走看看