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>
每天进步一点点,点滴记录,积少成多。
以此做个记录,
如有不足之处还望多多留言指教!