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>

 

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

以此做个记录,

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

 

posted @ 2021-11-15 18:43  金刀3691  阅读(238)  评论(0编辑  收藏  举报