2016-03-03 2 views
0

В настоящее время я пытаюсь обновить документ ElasticSearch с помощью API Java. У меня есть заводной скрипт со следующим кодом:ElasticSearch Java Api: обновить существующий документ

static updateRequestById(String agencyIndex, String type, String id, def policy) {   
     UpdateRequest updateRequest = new UpdateRequest() 
     updateRequest.docAsUpsert(true); 
     updateRequest.parent("agentNumber"); 
     updateRequest.index(agencyIndex) 
     updateRequest.type(type) 
     updateRequest.id(id) 
     updateRequest.doc("policies", policy) 
     elasticsearchClient.update(updateRequest).get() 
    } 

Проблема Я имею в том, что я хочу, чтобы обновить массив в пределах следующего документа:

{ 
    "took": 4, 
    "timed_out": false, 
    "_shards": { 
     "total": 10, 
     "successful": 10, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 1, 
     "max_score": 1, 
     "hits": [ 
     { 
      "_index": "int-b-agency", 
      "_type": "jacket", 
      "_id": "99808.1.27.09_4644", 
      "_score": 1, 
      "_source": { 
       "agentNumber": "99808.1.27.09", 
       "fileNumber": "4644", 
       "policies": [ 
        { 
        "agentNumber": "99808.1.27.09", 
        "fileNumber": "4644", 
        "policyNumber": "2730609-91029084", 
        "checkNumber": "0", 
        "checkAmount": 0, 
        "createdOn": null, 
        "createdBy": "traxuser621", 
        "propertyTypeCode": "", 
        "propertyTypeDesc": "1-4 FAMILY RESIDENTIAL", 
        "ppaddress": "110 Allan Ct ", 
        "ppcity": "Jacksonville", 
        "ppstate": "FL", 
        "ppzip": "32226", 
        "ppcounty": "Duval", 
        "policytype": "", 
        "status": "Active", 
        "effectiveDate": "2015-04-01T00:00:00-05:00", 
        "formType": "BASIC OWNERS - ALTA Owners Policy 06_306_FL - FL Original Rate", 
        "rateCode": "FLOR", 
        "rateCodeDesc": "FL Original Rate", 
        "policyTypeCode": "1", 
        "policyTypeCodeDesc": "BASIC OWNERS", 
        "amount": 200000, 
        "hoiAgentNumber": "", 
        "proForma": false, 
        "pdfLocation": "\\\\10.212.61.206\\FNFCenter\\legacy_jacket_pdfs\\2015_4_FL6465\\Policy_2730609-91029084.pdf", 
        "legacyPolicy": "true", 
        "associatedPolNbr": null 
        } 
       ] 
      } 
     } 
     ] 
    } 
} 

В документе выше у меня есть документ, который имеет массив под названием «политики» с одним объектом. Я хочу иметь возможность обновлять массив «политики» дополнительными объектами. Конечный результат должен выглядеть примерно так:

{ 
    "took": 4, 
    "timed_out": false, 
    "_shards": { 
     "total": 10, 
     "successful": 10, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 1, 
     "max_score": 1, 
     "hits": [ 
     { 
      "_index": "int-b-agency", 
      "_type": "jacket", 
      "_id": "41341.1.81.38_41340103", 
      "_score": 1, 
      "_source": { 
       "agentNumber": "41341.1.81.38", 
       "fileNumber": "41340103", 
       "policies": [ 
        { 
        "agentNumber": "41341.1.81.38", 
        "fileNumber": "41340103", 
        "policyNumber": "8122638-91036874", 
        "checkNumber": "0", 
        "checkAmount": 0, 
        "createdOn": null, 
        "createdBy": "traxuser621", 
        "propertyTypeCode": "", 
        "propertyTypeDesc": "1-4 FAMILY RESIDENTIAL", 
        "ppaddress": "1800 Smith St ", 
        "ppcity": "sicklerville", 
        "ppstate": "PA", 
        "ppzip": "08105", 
        "ppcounty": "Dauphin", 
        "policytype": "", 
        "status": "Active", 
        "effectiveDate": "2016-02-01T00:00:00-06:00", 
        "formType": "TestData", 
        "rateCode": "PASALERATE", 
        "rateCodeDesc": "Sale Rate - Agent", 
        "policyTypeCode": "26", 
        "policyTypeCodeDesc": "SALE OWNERS", 
        "amount": 180000, 
        "hoiAgentNumber": "", 
        "proForma": false, 
        "pdfLocation": "SomeLocation1", 
        "legacyPolicy": "true", 
        "associatedPolNbr": null 
        }, 
        { 
        "agentNumber": "41341.1.81.38", 
        "fileNumber": "41340103", 
        "policyNumber": "8122638-91036875", 
        "checkNumber": "0", 
        "checkAmount": 0, 
        "createdOn": null, 
        "createdBy": "traxuser621", 
        "propertyTypeCode": "", 
        "propertyTypeDesc": "1-4 FAMILY RESIDENTIAL", 
        "ppaddress": "1800 Smith St ", 
        "ppcity": "sicklerville", 
        "ppstate": "PA", 
        "ppzip": "08105", 
        "ppcounty": "Dauphin", 
        "policytype": "", 
        "status": "Active", 
        "effectiveDate": "2016-02-01T00:00:00-06:00", 
        "formType": "Test Data", 
        "rateCode": "PASALERATE", 
        "rateCodeDesc": "Sale Rate - Agent", 
        "policyTypeCode": "26", 
        "policyTypeCodeDesc": "SALE OWNERS", 
        "amount": 180000, 
        "hoiAgentNumber": "", 
        "proForma": false, 
        "pdfLocation": "SomeLocation2", 
        "legacyPolicy": "true", 
        "associatedPolNbr": null 
        } 
       ] 
      } 
     } 
     ] 
    } 
} 

Что я делаю неправильно?

ответ

2

Вы можете использовать скриптового обновление:

  1. Поместите новую политику в качестве параметра, например policy
  2. Используйте сценарий вроде следующего:

    if (!ctxt._source.policies) { ctxt._source.policies = [] } 
    ctxt._source.policies += policy 
    

Престола эта документация: https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html

+0

Спасибо за сообщение. Я сделал следующую модификацию: «static updateRequestById (String agencyIndex, String type, String id, def policy) { \t String script =" ctx._source.policies + = "+ policy; \t UpdateRequest updateRequest = new UpdateRequest (agencyIndex, type , id) .routing ("agentNumber"). parent (id) .script (script) \t elasticsearchClient.update (updateRequest) .get() } ", и теперь я получаю исключение из документа. Я также пытаюсь сделать это прямо в пределах завитка и получил одно и то же сообщение. Что мне не хватает? – dionysus

1

Обновления в инвертированных индексах - это удаление и замена документов. На месте обновления нет, как вы находите в db. ES использует Lucene под капотом, который в свою очередь реализует инвертированный индекс kick-ass.

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