Solr索引创建与更新-XML
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命令来传递参数,提交更新。
注意更新时一定要由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格式使用的广泛性。
下次我们讲解下其它格式的更新索引的方式。