2016-08-02 340 views
1

根據官方文檔Update API - Upserts,可以使用scripted_upsert以便在腳本中處理更新(針對現有文檔)或插入(針對新文檔)表單。事情是他們從來沒有表明腳本應該如何去做。 Java - Update API沒有關於ScriptUpsert使用的任何信息。使用ElasticSearch的script_upsert創建文檔

這是我使用的代碼:

//My function to build and use the upsert 
public void scriptedUpsert(String key, String parent, String scriptSource, Map<String, ? extends Object> parameters) { 
    Script script = new Script(scriptSource, ScriptType.INLINE, null, parameters); 
    UpdateRequest request = new UpdateRequest(index, type, key); 
    request.scriptedUpsert(true); 
    request.script(script); 
    if (parent != null) { 
     request.parent(parent); 
    } 
    this.bulkProcessor.add(request); 
} 

//A test call to validate the function 
String scriptSource = "if (!ctx._source.hasProperty(\"numbers\")) {ctx._source.numbers=[]}"; 
Map<String, List<Integer>> parameters = new HashMap<>(); 
List<Integer> numbers = new LinkedList<>(); 
numbers.add(100); 
parameters.put("numbers", numbers); 

bulk.scriptedUpsert("testUser", null, scriptSource, parameters); 

而且我得到以下異常時「爲testUser」文件不存在:
DocumentMissingException[[user][testUser]: document missing

我怎樣才能讓scriptUpsert工作從Java代碼?

回答

1

這是一個scripted_upsert命令應該怎麼看起來像(和它的腳本):

POST /sessions/session/1/_update 
{ 
    "scripted_upsert": true, 
    "script": { 
    "script": "if (ctx.op == \"create\") ctx._source.numbers = newNumbers; else ctx._source.numbers += updatedNumbers", 
    "params": { 
     "newNumbers": [1,2,3], 
     "updatedNumbers": [55] 
    } 
    }, 
    "upsert": {} 
} 

如果調用上面的命令和索引不存在,它會創建它,連同newNumbers值在新的文件中。如果再次調用完全相同的命令,則numbers值將變爲1,2,3,55

而在你的情況下,你缺少"upsert": {}部分。

0

正如安德烈建議我錯過了更新插入部分,改變功能:

public void scriptedUpsert(String key, String parent, String scriptSource, Map<String, ? extends Object> parameters) { 
    Script script = new Script(scriptSource, ScriptType.INLINE, null, parameters); 
    UpdateRequest request = new UpdateRequest(index, type, key); 
    request.scriptedUpsert(true); 
    request.script(script); 
    request.upsert("{}"); // <--- The change 
    if (parent != null) { 
     request.parent(parent); 
    } 
    this.bulkProcessor.add(request); 
} 

修復它。