簡體   English   中英

Java中的Elasticsearch通配符查詢 - 查找所有匹配字段並替換

[英]Elasticsearch wildcard query in Java - find all matching fields and replace

我想更新以“example/one”開頭的所有路徑字段。

Map<String, Object> parameters = new HashMap<>();
parameters.put("old", "example/one");
parameters.put("new", "new/example");
    
UpdateByQueryRequest request = new UpdateByQueryRequest(index)
        .setDocTypes(type)
        .setScript(new Script(ScriptType.INLINE,
                "painless",
                "ctx._source.path = ctx._source.path.replace(params.old, params.new);",
                parameters))
        .setQuery(QueryBuilders.wildcardQuery("path.tree", "example/one*"));

client.updateByQuery(request, RequestOptions.DEFAULT);

它不起作用(沒有更新,沒有錯誤 - 嘗試了前綴查詢,相同)。 但是,以下查詢正在更新匹配的文檔(郵遞員)。

POST my_index/_update_by_query
{
    "script": {
        "lang": "painless",
        "inline": "ctx._source.path = ctx._source.path.replace(\"example/one\", \"new/example\")"
    },
    "query": {
        "wildcard": {
            "path.tree": {
                "value: "example/one*",
                "boost": 1.0,
                "rewrite": "constant_score"
            }
        }
    }
}

我錯過了什么? 路徑層次標記器用於字段路徑
非常需要你的幫助。

PS:我無法升級到較新版本的 elasticsearch。

在測試解決方案時,我首先認為它與路徑字段上使用的自定義分析器有關。 但它很快就被丟棄了,因為我通過 Postman 得到了預期的結果。

我最終決定采用“兩步”解決方案(無法通過查詢 API 使用更新)。 首先搜索所有匹配的文檔,然后執行批量更新。

NativeSearchQuery query = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.wildcardQuery("path.tree", "example/one*"))
                .withSourceFilter(new FetchSourceFilter(new String[]{"_id", "path"}, null))
                .build();
        List<MyClass> result = elasticsearchRestTemplate.queryForList(query, MyClass.class);
        if(!CollectionUtils.isEmpty(result)) {
            Map<String, Object> parameters = new HashMap<>();
            parameters.put("old", "example/one");
            parameters.put("new", "new/example");
            Script script = new Script(ScriptType.INLINE,
                    "painless",
                    "ctx._source.path = ctx._source.path.replace(params.old, params.new)",
                    parameters);
            BulkRequest request = new BulkRequest();
            for (MyClass myClass : result) {
                request.add(new UpdateRequest(index, type, myClass.getId()).script(script));
            }
            client.bulk(request, RequestOptions.DEFAULT);
        }

更新

原來在請求中設置類型是問題所在。

UpdateByQueryRequest request = new UpdateByQueryRequest(index)
        .setDocTypes(type) <--------------- Remove
        .....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM