你能帮我理解为什么我有乐观的并发更新这样的结果。
说,我有以下文件:
{
"phrase": "some phrase",
"id": "5d1341797e2ed599",
"_version_": 1479312171996283000
}
在solrconfig.xml中:
<updateRequestProcessorChain name="dedupe">
<processor class="org.apache.solr.update.processor.SignatureUpdateProcessorFactory">
<bool name="enabled">true</bool>
<bool name="overwriteDupes">true</bool>
<str name="signatureField">id</str>
<str name="fields">phrase</str>
<str name="signatureClass">org.apache.solr.update.processor.Lookup3Signature</str>
</processor>
...
在schema.xml中:
<field name="phrase" type="text_en" indexed="true" stored="true"/>
...
<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
</fieldType>
...
<uniqueKey>id</uniqueKey>
因为我使用SignatureUpdate,所以我不能使用包含签名字段的部分更新请求(已知的Solr限制)。所以我尝试使用乐观并发更新来更新文档。
根据文档Optimistic Concurrency,如果在更新中指定文档版本,则版本字段的存在指示Solr仅在文档版本完全匹配时才接受更新。更新成功完成后,文档将有一个新的版本,保证高于最后一个。
如果我发送更新请求(短语字段已更改),如下所示:
curl http://localhost:8983/solr/collection1/update -H 'Content-type:application/json' -d '
[ {
"phrase": "some phrase. updated",
"_version_": 1479312171996283000
} ]'
我收到了冲突错误:
{
"responseHeader": {
"status": 409,
"QTime": 14
},
"error": {
"msg": "version conflict for f2adc45579faa53a expected=1479312171996283000 actual=-1",
"code": 409
}
}
为什么会出现这样的结果?
答案 0 :(得分:1)
来自heliosearch,请参阅下面的说明
如果客户端指定的版本与Solr中当前存在的版本不匹配,则将返回代码为409(Conflict)的HTTP错误。
$ curl -i http://localhost:8983/solr/update -H 'Content-type:application/json' -d '
[{"id":"book1", "author":"Mr Bean", "_version_":12345}]'
HTTP/1.1 409 Conflict
Content-Type: text/plain;charset=UTF-8
Transfer-Encoding: chunked
> {
"responseHeader":{
"status":409,
"QTime":1},
"error":{
"msg":"version conflict for book1 expected=12345 actual=1408814192853516288",
"code":409}}
请注意,我们使用curl选项-i来显示响应HTTP标头,以验证除了响应正文中的Solr级错误之外,还会生成HTTP级错误。