mysql跟solr集成删除的数据怎么同步不了

mysql跟solr集成删除的数据怎么同步不了,第1张

1、创建core或collection,有两种方式创建

第一种是使用命令行,查看README.txt所知道的

bin/solr create -c collection

第二种使用访问链接创建

localhost:8983/solr/admin/cores?action=CREATE&name=collection&instanceDir=collection

默认创建的目录在solr-5.2.1/server/solr下

2、修改solr-5.2.1/server/solr/collection/conf/managed-schema文件为schema.xml

前面进入conf文件夹一看,傻了,居然没有4.6.1里面的schema.xml文件,这怎么设置?后来看到别人的一个文件说可以设置,难道我去4.6.1复制一个过来,再仔细一看有个managed-schema文件,于是试着打开一看,看到了下面的内容:

This is the Solr schema file. This file should be named “schema.xml” and should be in the conf directory under the solr home(i.e. ./solr/conf/schema.xml by default)

3、在schema.xml添加filed,因为我的mysql数据库当中只有id和name两个字段,而name这个filed在schema.xml已经存在,我只需要添加id就行了,如下:

<fields>

<field name="id" type="int" indexed="true" stored="true" required="true" />

</fields>

<uniqueKey>id</uniqueKey>

<defaultSearchField>name</defaultSearchField>

4、修改solr-5.2.1/server/solr/collection/conf/下的solrconfig.xml的配置文件,配置一下添加数据库数据的xml,如下:

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">

<lst name="defaults">

<str name="config">data-config.xm

严格来说,lucene负责数据存储,而solr只是一个引擎提供搜索和插入而已,跟数据库的解释器一样,有什么好处呢,比如一个数据库有一个字段存了1000个字,你想从这些字里面搜一个词的时候,普通的数据库只会让你使用like去查询,他会遍历每个字去模糊匹配,效率很低,而且有些是无法查询的,当然除了像一些特殊的数据库带有分词,比如postgresql,那lucene做的事情就是分词,然后去匹配分词的词中是否有你想搜的词就好了,当然了,为了提高这种检索效率和内存节省底层做了很复杂的事情,可以这么简单的认为,全文搜索这件事情上数据库是无法满足的

一、增量索引之删除

昨天已经说过,增量索引其实就是SOLR对上次做过(增量或者全量)索引之后到这次做索引之间的这段时间数据库发生变化的数据进行创建索引,昨天我们说了增加一条数据或者修改一条数据之后创建增量索引,现在来说删除数据的增量索引。

其实这里所说的删除是假删除,什么意思呢?就是并不是说在数据库中把某些数据给彻底删除掉,而是说给你不想创建索引的数据一个标识符,然后告诉

solr,有这个标识符的数据你就不要给我创建索引了,我不需要,然后solr创建索引的时候就会忽视这些有特殊标识符的数据,大概的原理就是这样的,那

么怎么实现的呢?下面来看:

1.1数据库新增字段

昨天做新增的增量索引的时候需要在数据库添加一个字段,今天做删除的,还是需要一个字段,然后用这个字段来标示数据是否需要创建索引,字段如下所示:

字段名称大家可以自己看着定,类型给个int就行,至于长度也随意,我的是0表示需要创建索引的数据,1表示不需要创建索引的数据,也就是我所说的假删除的数据。

1.2修改配置文件

同样,需要将该字段配置到data-config.xml和schema.xml文件中,如下所示:

data-config.xml

注意圈起来的三个地方,首先肯定是需要把isdelete字段变成一个file标签,其次,需要query语句需要添加上where条件,查询出数据库中所有的需要创建索引的数据,然后再添加一个deletedPKQuery语

句,这条语句和deltaQuery与deltaImportQuery语句一样,都是只有在做增量索引的时候起作用,deletedPKQuery是查

询出所有假删除的数据的ID,然后由deltaImportQuery查询出这些ID对应的记录的全部数据,然后在已经创建的索引中删除掉这一部分索引。

schema.xml

schema.xml文件中倒是没有什么大的变化,只需要把isdelete字段添加进来即可:

1.3查看效果

按照上面的配置即可,然后我们来看一下效果,首先是数据库:

还是昨天的17条数据。

SOLR已经创建好的索引:

索引也是17条,和数据库的数据是对应的,下面我把数据库中的其中两条数据的isdelet字段修改成1,然后创建一个增量索引,方法和昨天一样,我就不再截图了,首先还是修改数据库:

把发哥跟梁朝伟的isdelete修改成1,执行增量索引后的结果如下:

可以看到此时的索引少了2条,那到底少的是不是我变成1的两个人呢?我们可以查找一下,找不到的话就对了:

可以看到此时查找周润发,但是只找到了星爷,这个原因还是分词器的问题,昨天已经说过了,下面再查一下梁朝伟:

可以看到查找结果是空的。

通过上面的两条查询,说明我们对假删除所做的增量索引时成功的。

二、定时增量索引

如果每次数据库变化两条数据我们就得到http://localhost:8080/solr这里做一次增量索引,那不是很麻烦吗?所以SOLR提供了定时任务的功能,当然你也可以自己集成,比如用sPRing的定时任务,或者集成Quartz这些,定时执行一下增量索引的URL,也是可以达到相同的目的的,但是我们今天说的并不是这个,下面开始详细说。

首先,需要引入一个JAR包,这个JAR包我已经发在了第一篇文章最后的DEMO里面了,解压之后就可以看到,但是我要说一点的是,我发出的JAR包是修改过源码的JAR包,很多地方给出的JAR包是apache-solr-dataimportscheduler-1.0.jar这

个JAR包,下载地址是http://code.google.com/p/solr-dataimport-scheduler/downloads

/list,但是这个jar包放入tomcat下的solr项目的lib包后会出错,其实也不是出错,而是出现下面的问题:

http请求一直返回415,提示不支持的媒体类型,

这个问题上周六折腾了我一天的时间,快被郁闷死了,后来在网上查资料的时候看到了别人的一篇文章,也才得以解决,一会儿我会把那个文章地址也发出来,这是

什么原因呢?原因就是这个jar包中的一个类在发送http请求时使用的是post方式,但是我们这里发送的请求却是get方式,所以才一直415,很蛋

疼有没有,所以需要进入jar包,修改源码之后才能正常工作,我看的那篇文章地址是:http://blog.csdn.net/zwx19921215

/article/details/43152307,里面讲的很详细,还有另外的一个问题,大家可以看一下,好了,把这个jar包引入solr的lib

包之后进行下一步。

第二步就是在solr的web.xml文件中添加如下代码:

第三步,解压apache-solr-dataimportscheduler-1.0.jar文件,从解压出来的文件夹中找出dataimport.properties文件,然后复制该文件到你的SOLR_HOME目录下的conf文件夹中,

注意,这个conf文件夹并不是SOLR_HOME\collection1下的conf,而是SOLR_HOME\conf文件夹,以前是不存在的,需要你自己创建。 、

第四步,打开dataimport.properties文件,修改该文件内容,修改后的文件内容如下所示:

#################################################

# #

# dataimport scheduler properties #

# #

#################################################

# to sync or not to sync

# 1 - activeanything 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=collection1

# solr server name or ip address

# [defaults to localhost if empty]

server=localhost

# solr server port

# [defaults to 80 if empty]

port=8080

# 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&wt=json&optimize=false

# schedule interval

# number of minutes between two runs

# [defaults to 30 if empty]

interval=1

# 重做索引的时间间隔,单位分钟,默认7200,即1天

# 为空,为0,或者注释掉:表示永不重做索引

reBuildIndexInterval=7200

# 重做索引的参数

reBuildIndexParams=/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.syncCores=collection1表示对collection1这个core定时创建索引,如果不设置的话,默认也是对collection1创建索引,如果用到了multicore,那么使用逗号隔开即可。

2.server=localhost,port=8080改成你自己的容器地址和端口号即可;

3.interval=1表示定时增量索引的时间间隔,单位是分钟;

4.其他的按照上面的注释配置即可,也没什么难理解的;


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9913463.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-03
下一篇2023-05-03

发表评论

登录后才能评论

评论列表(0条)

    保存