Solr乐观并发更新:版本冲突

时间:2014-09-18 13:44:25

标签: solr conflict

你能帮我理解为什么我有乐观的并发更新这样的结果。

说,我有以下文件:

{
  "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
  }
}

为什么会出现这样的结果?

1 个答案:

答案 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级错误。