solr配置连接mysql实现全量更新和增量更新
数据库连接的配置
前提是完成我上一篇文章的配置solr的下载和安装
- 找到我们配置好的core,在conf文件夹中创建data-config.xml 文件,写入如下配置内容,并保存:
写入如下内容
<dataConfig>
<!--dataSource标签配置数据库相关的信息-->
<dataSource name = "ds_1" type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/数据库名?characterEncoding=UTF-8"
user="root" password="密码"/>
<document>
<!--pk属性指定的是manage-schema文件中的uniqueKey标签中的值,即主键-->
<entity name="SolrTest" dataSource="ds_1" PK="id"
query="select id,`time`,message,`level`,thread_name ,class_name ,method,app_name from error_log "
deltaImportQuery="select id,`time`,message,`level`,thread_name ,class_name ,method,app_name from error_log where id = '${dih.delta.id}'"
deltaQuery="select id,`time`,message,`level`,thread_name ,class_name ,method,app_name from error_log where time > '${dih.last_index_time}'"
>
<!--以下的字段column属性对应数据库中字段名称,name是对应solr这边配置的名称,注意id,默认名称即为id,表示solr这边一条数据的主键,以下三个是要在solr这边中建立索引的字段,比如数据库中有10个字段,我只需要为3个字段建立索引关系,那这里就写3个就好了
如果数据库中的主键不是id,比如是objectId,那上边的query需要为它起一个别名为id即可-->
<field column="id" name="id" />
<field column="message" name="message" />
<field column="level" name="level" />
<field column="thread_name" name="threadName" />
<field column="class_name" name="className" />
<field column="method" name="method" />
<field column="app_name" name="appName" />
<field column="time" name="time" dateTimeFormat="yyyy-MM-dd HH:mm:ss"/>
</entity>
</document>
</dataConfig>
注意driver,是mysql就写mysql的驱动,是oracle就写oracle的
- 然后找到同目录下的solrconfig.xml 文件并打开,在里边加入如下内容,放置的位置你可以放到其他requestHandler
旁边:
<requestHandler name="/dataimport" class="solr.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
3. 然后再找到同目录下的managed-schema 文件并打开,在里边加入如下内容
<!--数据库中需要索引的字段-->
<field name="message" type="string" indexed="true" stored="true" />
<field name="level" type="string" indexed="true" stored="true" />
<field name="threadName" type="string" indexed="true" stored="true" />
<field name="className" type="string" indexed="true" stored="true" />
<field name="method" type="string" indexed="true" stored="true" />
<field name="appName" type="string" indexed="true" stored="true" />
<field name="time" type="date" indexed="true" stored="true" />
数据库驱动、solr导入包
上边配置完之后,需要引入几个jar包,数据库驱动包,以及solr的数据导入包,数据库驱动包,要根据你自己是oracle 或者mysql 等引入。至于solr的数据导入包,可以找到solr-7.3.0\dist 文件夹,里边有如下包:
将以上包拷贝到solr-7.3.0\server\solr-webapp\webapp\WEB-INF\lib 中,如下:
启动solr,找到如图所示的地方
执行导入,如下图所示就成功了
点击query查看数据
利用spring的定时任务执行自动全量更新和增量更新
据说有很多种方式可以实现
- 在solr中配置,有第三方插件实现。
- 自己写程序实现。
- 写个定时任务发请求实现
我采用的第三种方式,代码如图所示(前提是:springboot项目整合了solr)
@Component
public class SyncLogScheduler {
@Autowired
private SolrService solrService;
/**
* 全量索引
*/
/* @Scheduled(cron = "0/30 * * * * *")
public void fullImport() {
System.out.println("全量更新我执行了--------------------");
doUpdate("http://localhost:8983/solr/log_core/dataimport?command=full-import&clean=true&commit=true");
}
*/
/**
* 增量索引
*/
@Scheduled(cron = "0/20 * * * * *")
public void deltaImport() {
System.out.println("增量更新我执行了--------------------");
doUpdate("http://localhost:8983/solr/log_core/dataimport?command=delta-import&clean=false&commit=true");
}
private void doUpdate(String url) {
CloseableHttpClient client = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse response = null;
try {
//3.执行请求,获取响应
response = client.execute(httpGet);
//看请求是否成功,这儿打印的是http状态码
System.out.println(response.getStatusLine().getStatusCode());
} catch (IOException e) {
e.printStackTrace();
}
}