设为首页 收藏本站
查看: 1055|回复: 0

[经验分享] Solr索引创建与更新-XML

[复制链接]

尚未签到

发表于 2016-12-16 07:34:53 | 显示全部楼层 |阅读模式
Solr索引创建与更新-XML

 

 

在上一节中,我们成功启动了solr,并且将数据成功更新到solr中,本次我们来学习一下solr的更新方式。
solr提供了三种更新方式,xml、json、csv,这新更新方式在solr4.0里面都统一用solr.UpdateRequestHandler进行了支持,不过在提交的Content-type中需要设置相应的格式。
 
 
下面我们了解下solr更新索引的方式,先看下xml,xml格式算是最简单,最容易理解的格式,如果想理解solr能够处理的格式,可以参考下solr目录下example/exampledocs目录,里面后缀xml结尾的文档,都是solr支持的xml格式索引。
 
 
在上一篇文章中,我们执行过这个命令:
 

java -jar post.jar *.xml  
 
 
这个命令实际上是利用了post.jar的提交功能,当然我们也可以自己提交文档,并且提交自己文档内容,如果想用xml格式提交的话。
 
我们直接以官网为例说明,同时会有solr安装包里面的例子补充,后面介绍json格式和csv格式也一样,不再赘述。
 
XML格式提供增加索引,和删除索引两种功能;那修改索引怎么办?你可以用增加索引的方法,但是可以设定覆盖,或者修改;查询的话就是另外一个话题了,以后会有分析。
 
 
增加索引的xml格式:
 

<add>
<doc>
<field name="employeeId">05991</field>
<field name="office">Bridgewater</field>
<field name="skills">Perl</field>
<field name="skills">Java</field>
</doc>
[<doc> ... </doc>[<doc> ... </doc>]]
</add>

 
 
这个是极其简单的xml格式,连校验的schema都没有,所以说格式的准确性和内容的正确性都需要自己校验。
看完这个格式,就能理解solr添加xml索引的方式了,是不是比较简单;下面简单解释一下标签属性:
 
 
add标签的可选属性:
 

overwrite="true"|"false":默认是true,同一个uniqueKey的文档会被覆盖
commitWithin="milliseconds":在规定时间内,文件会被加入索引。

 
 
doc标签的可选属性:
 

boost=<float>:默认是1.0,boost的含义见lucene
 
 
field标签的可选属性: 
 

boost=<float>:默认是1.0,field标签的boost含义和doc字段的boost含义不同
boost使用的例子如下:

<add>
<doc boost="2.5">
<field name="employeeId">05991</field>
<field name="office" boost="2.0">Bridgewater</field>
</doc>
</add> 
  
 

update="add"|"set"|"inc"
 update的使用例子如下:add表示新添文档,set表示设置field值,inc是个原子操作,solr4,0支持
 

<add>
<doc>
<field name="employeeId">05991</field>
<field name="office" update="set">Walla Walla</field>
<field name="skills" update="add">Python</field>
</add>

 
 如果field有多个值的话,同样可以对多个field使用update属性
 

<add>
<doc>
<field name="employeeId">05991</field>
<field name="skills" update="set">Python</field>
<field name="skills" update="set">Java</field>
<field name="skills" update="set">Jython</field>
</add>

 
 
两外还有commit和optimize这两个字段
 

<commit/>
<optimize/>

 
 
这两个字段的用法比较高级,其中commit分为hard commit和soft commit,前者确保索引修改对其它的请求可见;后者只保证对当前的这次操作之后的索引可见,如果JVM crash或者断点的话,后者所做的修改时不会被写到索引文件中,当然,后者肯定要更快点,如何使用还要仔细斟酌。optimize字段和hard commit类似,不过这个操作会强制索引文件合并;这个操作一定要慎重,因为合并索引文件费时费力费资源;其实optimize操作一般是不用操心的,由MergePolicy决定,这个参数会强制MergePolicy立即执行合并策略。
commit和optimize字段是个比较高级的语法,在更新时的考虑比较多,在这篇文章里面就说到这里,想要了解更多参考文档。
 
 
下面我们使用CURL命令来传递参数,提交更新。
关于curl命令,有不理解的地方请看这里:http://isilic.iyunv.com/blog/1764049,下面curl的语法也比较简单,不多做解释,有疑问请点击前面的链接。
注意更新时一定要由Content-Type字段,并且值必须为text/xml,告诉程序调用Xml方式更新。
 
 

curl "http://localhost:8983/solr/update?commit=true" -H "Content-Type: text/xml" --data-binary '<add><doc><field name="id">testdoc</field></doc></add>'
 提交的post请求数据就是xml格式
 
 
如果有其它的参数提交需求,也可以提交在curl命令后面:
 

curl "http://localhost:8983/solr/update?commitWithin=10000" -H "Content-Type: text/xml" --data-binary '<add><doc><field name="id">testdoc</field></doc></add>'
 
 
下面看下delete语法,按照id和query删除文档:
 

<delete>
<id>05991</id><id>06000</id>
<query>office:Bridgewater</query>
<query>office:Osaka</query>
</delete>

 
 

<rollback/>
<prepareCommit/>

 这两个是专家级别Expert-Level的API,不多做解释了,一般用不到。
 
 
更新数据索引:
 

curl http://<hostname>:<port>/solr/update -H "Content-Type: text/xml" --data-binary '
<add>
<doc boost="2.5">
<field name="employeeId">05991</field>
<field name="office" boost="2.0">Bridgewater</field>
</doc>
</add>'

 
 
当然get请求也可以,不过get请求参数必须是url-encoded
 

http://localhost:8983/solr/update?stream.body=%3Cdelete%3E%3Cquery%3Eoffice:Bridgewater%3C/query%3E%3C/delete%3E
http://localhost:8983/solr/update?stream.body=%3Ccommit/%3E

 
 
如果想同时更新和删除文档,下面这种格式是错误的。
 

curl http://127.0.0.1:8983/solr/update/?commit=true -H "Content-Type: text/xml" --data-binary '<add><doc><field name="id">17</field></doc></add><delete><id>1234</id></delete>';
 
 
有点想当然了,准确的应该是将这些操作用update标签包起来
 

curl http://127.0.0.1:8983/solr/update/?commit=true -H "Content-Type: text/xml" --data-binary '<update><add><doc><field name="id">17</field></doc></add><delete><id>1234</id></delete></update>';
 
最后,XML格式更新索引部分算是结束了,XML格式算是使用最为悠久的格式之一了,所以solr对于XML格式的支持也是不遗余力,这个也很容易证明XML格式使用的广泛性。
下次我们讲解下其它格式的更新索引的方式。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-314846-1-1.html 上篇帖子: 开源全文搜索:Lucene与Solr 下篇帖子: solr autoCommit 服务端自动提交配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表