2014-09-18 5 views
0

Не могли бы вы помочь мне понять, почему у меня такие результаты для оптимистического обновления параллелизма.Solr оптимистичное обновление параллелизма: конфликт версий

Скажем, у меня есть следующий документ:

{ 
    "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, я могу 't использовать частичные запросы на обновление, содержащие поле подписи (известное ограничение 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

от heliosearch см объяснение ниже

If the client specifies a version that does not match what currently exists in Solr, an HTTP error with code 409 (Conflict) will be returned.

$ 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}} 
 
`

Note that we used the curl option -i to show the response HTTP headers to verify that this generated an HTTP-level error in addition to the Solr-level error in the body of the response. enter link description here

Смежные вопросы