如何使用Java客户端在Elastic Search上更新条目

时间:2019-03-29 15:35:18

标签: java elasticsearch

我正在尝试使用弹性搜索客户端更新es模型信息

org.elasticsearch.client.Client

https://www.programcreek.com/java-api-examples/?api=org.elasticsearch.client.Client

我真的很难找到正确的方法,因为我不知道索引和匹配器,对不起,我是这个主题的初学者。

  {
    "_index": "my_index_20",
    "_type": "student",
    "_id": "a80ae58",
    "_source": {
      "model": {
        "id": "a80ae58748e",
        "name": "John Doe"
        ....

到目前为止我的代码

 response = esClient.prepareUpdate("student", "name", "John Doe")
                    .setDoc(jsonBuilder()               
                    .startObject()
                    .field("name", "Joe Doe")
                    .endObject())
                    .get();

我使用正确的索引吗?还是我可以在这里更改什么?

我没有收到任何错误,但是结果是“文档丢失” ...这意味着我可能没有使用正确的索引。

想法?

根据反馈和更多信息进行了更新...

我将其移至

response = esClient.prepareUpdate("my_index_20", "student", "a80ae58")
                    .setDoc(jsonBuilder()               
                    .startObject()
                    .field("name", "Joe Doe")
                    .endObject())
                    .get();

这行得通,但是由于我不知道索引ID我无法执行此操作,因此查询生成器或其他功能可以通过任何方法来执行此操作吗?

1 个答案:

答案 0 :(得分:2)

这是 prepareUpdate 方法的签名:

UpdateRequestBuilder prepareUpdate(String index, String type, String id);

所以正确的语法可能是

esClient.prepareUpdate("my_index_20", "student", "a80ae58").setDoc(...)...

如果要通过匹配其他字段来执行此操作,请使用查询更新。

String indexName = "my_index_*"; //Assuming that you don't know the exact index, but know the global format (for example the beginning of the name of the index)
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.filter(QueryBuilders.termQuery("name", "John Doe"));
boolQuery.filter(QueryBuilders.termQuery("otherField", "otherFieldValue"));
UpdateByQueryRequestBuilder updateByQuery = UpdateByQueryAction.INSTANCE.newRequestBuilder(esClient);
updateByQuery.source(indexName); 
updateByQuery.filter(boolQuery); 
BulkByScrollResponse updateResponse = updateByQuery.get();