solr触发URL
solr更新索引: http://localhost:8080/solr/fare/dataimport?command=delta-import&commit=true&optimize=true
solr删除根据查询语句指定索引 http://localhost:8080/solr/fare/update/?stream.body=<delete><query>policyId:38502</query></delete>&stream.contentType=text/xml;charset=utf-8&commit=true&optimize=true
dataconfig的结构
dataconfig的结构不是一成不变的,entity和field元素中的属性是随意的,这主要取决于processor和transformer。
以下是entity的默认属性
- name(必需的):name是唯一的,用以标识entity
- processor:只有当datasource不是RDBMS时才是必需的。默认值是SqlEntityProcessor
- transformer:转换器将会被应用到这个entity上,详情请浏览transformer部分。
- pk:entity的主键,它是可选的,但使用“增量导入”的时候是必需。它跟schema.xml中定义的uniqueKey没有必然的联系,但它们可以相同。
- rootEntity:默认情况下,document元素下就是根实体了,如果没有根实体的话,直接在实体下面的实体将会被看做跟实体。对于根实体对应的数据库中返回的数据的每一行,solr都将生成一个document。
一下是SqlEntityProcessor的属性
-
query (required) :sql语句
-
deltaQuery : 只在“增量导入”中使用
-
parentDeltaQuery : 只在“增量导入”中使用
-
deletedPkQuery : 只在“增量导入”中使用
-
deltaImportQuery : (只在“增量导入”中使用) . 如果这个存在,那么它将会在“增量导入”中导入phase时代替query产生作用。这里有一个命名空间的用法${dataimporter.delta.}详情请看solr1.4.
Commands
The handler 通过httprequest 向外界提供它的API . 以下是一些或许你会用到的操作
-
full-import : "完全导入"这个操作可以通过访问URL http://:/solr/dataimport?command=full-import 完成。
-
这个操作,将会新起一个线程。response中的attribute属性将会显示busy。
-
这个操作执行的时间取决于数据集的大小。
-
当这个操作运行完了以后,它将在conf/dataimport.properties这个文件中记录下这个操作的开始时间
-
当“增量导入”被执行时,stored timestamp这个时间戳将会被用到
-
solr的查询在“完全导入”时,不是阻塞的
-
它还有下面一些参数:
-
clean : (default 'true'). 决定在建立索引之前,删除以前的索引。
-
commit: (default 'true'). 决定这个操作之后是否要commit
-
optimize: (default 'true'). 决定这个操作之后是否要优化。
-
debug : (default false). 工作在debug模式下。详情请看 the interactive development mode (see here)
-
-
-
delta-import : 当遇到一些增量的输入,或者发生一些变化时使用` http://:/solr/dataimport?command=delta-import . 它同样支持 clean, commit, optimize and debug 这几个参数.
-
status : 想要知道命令执行的状态 , 访问 URL http://:/solr/dataimport .它给出了关于文档创建、删除,查询、结果获取等等的详细状况。
-
reload-config : 如果data-config.xml已经改变,你不希望重启solr,而要重新加载配置时,运行一下的命令http://:/solr/dataimport?command=reload-config
-
abort : 你可以通过访问 url http://:/solr/dataimport?command=abort 来终止一个在运行的操作
从数据库导入大量数据而导致内存溢出问题解决(网上资料仅参考)
<entity name="TestEntity" dataSource="dsSqlServer" pk="Id" query="SELECT Id,Title,Author,Content,Url,AddOn FROM Test WHERE Id>=${dataimporter.request.offset} And Id<=${dataimporter.request.offset}+10000" >
同时运用1) /dataimport?clean=true&offset=0
2) /dataimport?clean=false&offset=1000000
3) /dataimport?clean=false&offset=2000000
这些URL去请求SOlr进行索引.Solr会读取offset这个参数区建立query查询语句,然后去获取这些查询语句的数据去索引.但如此最好还是自己写个类做下控制.可以一开始获取表的总结果条数然后通过以上循环迭代完成.其中里面的+10000也可以设置为一个参数,如${dataimporter.request.intervalRows}表示一次获取多少条,然后在URL里加&intervalRows这个参数,具体我还还没试过.同时由于索引还是个长期的过程,所以这里最好记录好每次索引索引成功的间隔.比如在30000-40000索引成功的时候将他们记录日志.如此在索引40000-50000的时候一旦发生问题,我们可以通过日志获取上一次成功索引的间隔数,再从这个间隔去重新生成URL去索引数据.
更多:http://blog.csdn.net/jiushuai/article/details/8087961
solr多core
在实际应用场景中,常常会有表嵌套关系,在solr中的表现即是实体嵌套实体,以支持某些字段多值的情况,但是这样做有一个很大的性能问题,就是导入速率非常慢原因是嵌套会造成访问数据库量增大
解决方案:
1、solr使用多core
2、后台请求多core数据,并根据关系进行合并
增量导入慢问题解决
分析:增量导入中有两个问题1、导入慢,原因是每次都要根据ID去查询数据库,数据量大时访问多
2、导入非常耗内存
解决方案如下:
去掉增量查询语句,主查询语句,改为类似:
<entity name="item" pk="ID" query="SELECT * FROM item
WHERE '${dataimporter.request.clean}' != 'false'
OR last_modified > '${dataimporter.last_index_time}'">
注意, '${dataimporter.request.clean}' != 'false' OR last_modified > '${dataimporter.last_index_time}' 这个条件放在其他条件之后
全量导入 使用命令dataimport?command=full-import&clean=true
增量导入使用dataimport?command=full-import&clean=false
这样处理后全量和增量共用一条一句,极大的提高了查询速率
关于query条件设置:
【LIKE-模糊】:id:*111* 查找ID中含有111的项(与like同)
【IN-多值】id:(1 2 3 4) 查找ID为1,2,3,4的项(与in同)
【BetweenAnd-范围】id:[1 TO *] 查找ID大于等于1的项(与between and同 TO可省略) "Fields:['2013-01-01' TO '2014-01-01']"