我正在尝试使用弹性搜索客户端更新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我无法执行此操作,因此查询生成器或其他功能可以通过任何方法来执行此操作吗?
答案 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();