zoukankan      html  css  js  c++  java
  • solr学习笔记-全量更新与增量更新,去除html标签

    前段时间开发使用了solr进行全量更新,近期开发过程中对接信息发布,要求信息发布与更新要及时更新到solr中,使用全量更新耗时时间长效率太低,经过几番搜索找到了增量更新的方法:

    (solr版本:7.7.2)

    1.solrhome中的conf/data-config.xml

    <dataConfig>
        <dataSource type="JdbcDataSource"
            driver="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@localhost:1521/orcl"
                    user="db_user" password="db_password" />
        <document>
            <entity name="V_CONTENT" pk="ARTICLE_ID" transformer="ClobTransformer" 
                query="select * from V_CONTENT" 
                deltaQuery="select ARTICLE_ID from V_CONTENT where ARTICLE_ID='${dataimporter.request.id}' or CHANNEL_ID='${dataimporter.request.channelId}'" 
                deltaImportQuery="select * from V_CONTENT where ARTICLE_ID='${dih.delta.ARTICLE_ID}'" >
                <field column="ARTICLE_ID" name="id" />
                <field column="TITLE" name="articleTitle" />
                <field column="SHORT_TITLE" name="shortTitle" />
                <field column="CHANNEL_ID" name="channelId" />
                <field column="CHANNEL_NAME" name="channelName" />
                <field column="ARTICLE_KEYWORDS" name="articleKeywords" />
                <field column="ARTICLE_DIGEST" name="articleDigest" />
                <field column="ARTICLE_SOURCE" name="articleSource" />
                <field column="ARTICLE_VIEW_RIGHT" name="articleViewRight" />
                <field column="ARTICLE_CONTENT" name="articleContent" clob="true"/>
                <field column="IS_TOP" name="isTop" />
                <field column="TOP_DATE" name="topDate" />
                <field column="WRITE_TIME" name="writeTime" />
                <field column="PUBLISH_TIME" name="publisherTime" />
                <field column="PBTIME" name="pbtime" />
                <field column="SITE_ID" name="siteId" />
                <field column="URL" name="url" /> 
            </entity>
        </document>
    </dataConfig>

    说明:

    dataSource:需要建立索引的数据库的相关配置

    document:需要建立索引的数据库数据的实体映射关系建立在此标签内,可建立多个实体

    entity:需要建立索引的数据库数据的实体映射关系

      name:数据库中的表明或视图名

      pk:数据库中的主键名,注意大小写

      transformer=”ClobTransformer“:如果实体数据中包含colb字段需添加此配置,与<field column="" name="" clob="true" />结合使用

           query:全量导入需要执行的sql

      deltaQuery:查询出所有经过修改的记录的ID,可能是修改操作,添加操作,删除操作产生的(此查询只对增量导入起作用,而且只能返回ID值)

           deltaImportQuery:次查询是获取以上步的ID,然后把其全部数据获取,根据获取的数据,对索引库进行更新操作,可能是删除,添加,修改(此查询只对增量导入起作用,可以返回多个字段的值,一般情况下,都是返回所有字段的列)

        ${dataimport.request.id}/${dataimport.request.channelId}:获取请求连接中自定义的参数,如:主键id、channelId等。

        ${dih.delta.ARTICLE_ID}:获取deltaQuery查询结果

    更多信息请参看(solr增量更新之同步(添加、修改、删除)

    全量更新请求地址:

    http://localshot:8080/solr/content/dataimport?command=full-import&commit=true&clean=true

    增量更新请求地址:

    http://localshot:8080/solr/content/dataimport?command=delta-import&commit=true&clean=false&id=&channelId=

    获取更新导入状态:

    http://localshot:8080/solr/content/dataimport?command=status

    其中 content 为创建的索引库的名称,需注意请求中 索引库名称 防止请求出错或更新出错!!!

    参数说明:

    command:

      full-import:全量更新

      delta-import:增量更新

      status:获取更新导入状态

    clean:选择是否要在索引开始构建之前删除之前的索引,默认为true。注意增量更新时设置此参数clean=false,否则将会清除所有已建索引!!!

    commit:选择是否在索引完成之后提交。默认为true

    optimize:是否在索引完成之后对索引进行优化。默认为true

    debug:是否以调试模式运行,适用于交互式开发(interactive development mode)之中。请注意,如果以调试模式运行,那么默认不会自动提交,请加参数“commit=true”

    所有命令如下 :

    public static final String FULL_IMPORT_CMD = "full-import";
     
      public static final String IMPORT_CMD = "import";
     
      public static final String DELTA_IMPORT_CMD = "delta-import";
     
      public static final String ABORT_CMD = "abort";
     
      public static final String DEBUG_MODE = "debug";
     
      public static final String RELOAD_CONF_CMD = "reload-config";
     
      public static final String SHOW_CONF_CMD = "show-config";

    2.增量更新使用solr客户端(HttpSolrClient)

    引入jar包:solr-solrj-5.5.5.jar

    在项目配置文件Application-context.xml(更具自己项目实际情况进行配置)中注入bean:

    <bean id="httpSolrClient" class="org.apache.solr.client.solrj.impl.HttpSolrClient">
            <constructor-arg index="0" value="http://localhost:8080/solr/"/>
            <property name="connectionTimeout" value="30000"/>
        </bean>

    java代码:

    @Service("solrServiceImpl")
    public class SolrServiceImpl implements SolrService {
    
        @Resource
        private HttpSolrClient httpSolrClient;
    
        /**
         * 获取所有数据
         *
         * @param solrName      上文说的的创建的索引库的名称,如:content
         * @throws Exception
         */
        @Override
        public Object getAllList(String solrName) throws Exception {
            SolrQuery solrQuery = new SolrQuery();
            solrQuery.set("q", "*:*");
            QueryResponse response = httpSolrClient.query(solrName, solrQuery);
            SolrDocumentList documents = response.getResults();
            return documents;
        }
    
        /**
         * 根据主键id删除
         *
         * @param solrName      上文说的的创建的索引库的名称,如:content
         * @throws Exception
         */
        @Override
        public void delById(String solrName, String id) throws Exception {
            httpSolrClient.deleteById(solrName, id);
            httpSolrClient.commit(solrName);
        }
    
        /**
         * 根据channelId删除
         *
         * @param solrName      上文说的的创建的索引库的名称,如:content
         * @throws Exception
         */
        @Override
        public void delByChannel(String solrName, String channelId) throws Exception {
            httpSolrClient.deleteByQuery(solrName, "channelId:" + channelId);
            httpSolrClient.commit(solrName);
        }
    
        /**
         * 删除所有索引(慎用)
         *
         * @param solrName      上文说的的创建的索引库的名称,如:content
         * @throws Exception
         */
        @Override
        public void deleteAll(String solrName) throws Exception {
            httpSolrClient.deleteByQuery(solrName, "*:*");
            httpSolrClient.commit(solrName);
        }
    
        /**
         * 通过id获取数据
         *
         * @param solrName      上文说的的创建的索引库的名称,如:content
         * @return
         * @throws Exception
         */
        @Override
        public SolrDocument getById(String solrName, String id) throws Exception {
            return httpSolrClient.getById(solrName, id);
        }
    
        /**
         * 全量更新
         *
         * @param solrName      上文说的的创建的索引库的名称,如:content
         * @return
         * @throws Exception
         */
        @Override
        public String updateSolr(String solrName) throws Exception {
            String url = ConfigConsts.SOLR_SERVICE_ROOT_URL + solrName + "/dataimport";
            String params = "command=full-import&clean=true&commit=true";
            return HttpRequestUtil.sendGet(url, params);
        }
    
        /**
         * 根据文章id或栏目id 增量更新
         *
         * @param solrName      上文说的的创建的索引库的名称,如:content
         * @return
         * @throws Exception
         */
        @Override
        public String updateDeltaImportSolr(String solrName, String contentId, String channelId) throws Exception {
            //设置请求的路径
            String url = ConfigConsts.SOLR_SERVICE_ROOT_URL + solrName + "/dataimport";
            String params = "command=delta-import&clean=false&commit=true&id=" + contentId + "&channelId=" + channelId;
            return HttpRequestUtil.sendGet(url, params);
        }
    
        /**
         * 获取solr导入状态
         *
         * @param solrName      上文说的的创建的索引库的名称,如:content
         * @return
         * @throws Exception
         */
        public String getImportStatus(String solrName) throws Exception {
            String url = ConfigConsts.SOLR_SERVICE_ROOT_URL + solrName + "/dataimport";
            return HttpRequestUtil.sendGet(url, "command=status");
        }
    }

    3.导入时去除html标签 

      3.1、在 数据库 的读取文件data-config.xml 中的entity 标记里边添加 transformer=”HTMLStripTransformer” 代码 。

    <entity name="edusystem" pk="url" transformer="HTMLStripTransformer" query="SELECT description from table">
        <field column="description" name="description" stripHTML="true"/>
      </entity>

      3.2、在field 字段需要过滤html代码的字段添加 stripHTML=”true”

    <entity name="edusystem" pk="url" transformer="HTMLStripTransformer" query="SELECT description from table">
        <field column="description" name="description" stripHTML="true" />
      </entity>

      3.3、修改schema.xml文件中的fieldType标记中的内容,添加如下代码<charFilter class=”solr.HTMLStripCharFilterFactory” />

    <analyzer type="query">
        <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" reload="true" />
        <filter class="solr.LowerCaseFilterFactory" />
        <charFilter class="solr.HTMLStripCharFilterFactory" />
      </analyzer>

    每天进步一点点,点滴记录,积少成多。

    以此做个记录,

    如有不足之处还望多多留言指教!

  • 相关阅读:
    第一篇:数据仓库概述
    第五篇:数据库系统的实现
    第四篇:SQL
    Django框架ORM常用参数汇总_模型层
    Django框架ORM常用字段汇总_模型层
    Boost.Asio的使用技巧
    Boost库之asio io_service以及run、run_one、poll、poll_one区别
    Boost::asio io_service 实现分析
    boost asio中io_service类的几种使用
    boost::io_service解读
  • 原文地址:https://www.cnblogs.com/jindao3691/p/15557692.html
Copyright © 2011-2022 走看看