Ausgabe
Ich habe ein Java-Programm, das bei einigen Parametern dynamisch Abfragen für ElasticSearch erstellt. Derzeit entgeht die Art und Weise, wie ich dies gebaut habe, den Zeichenfolgen, da das JsonObject als Teil der GSON-Bibliothek von Google eine Zeichenfolge zum Anhängen von JSON übergeben muss.
Die Ausgabe der folgenden Methoden ist die folgende:
{
"query":{
"bool":{
"filter":[
{
"exists":"{\"field\":\"user_id\"}"
},
{
"exists":"{\"field\":\"campaign_id\"}"
}
]
}
}
}
Wie Sie sehen können, handelt es sich bei den Existing-Werten um Escapes, und ElasticSearch macht diesbezüglich einen Anfall. Wie kann ich dieses Ergebnis erzielen, ohne die Escape-Zeichenfolgen zu haben?
JsonObject buildQuery() {
JsonObject request = new JsonObject();
// build the terms query
JsonArray termsArr = new JsonArray();
termsArr.add(buildFilterQueryForField("user_id"));
termsArr.add(buildFilterQueryForField("campaign_id"));
JsonObject terms = JsonHelper.createObject("bool.filter", termsArr);
request.add("query", terms);
return request;
}
Unten ist der Code für die buildFilterQueryForField(*)
. In dieser Methode habe ich versucht, einen Regex zu verwenden, um diese zu entfernen, aber dieser Regex gibt mir nicht das Ergebnis, nach dem ich suche.
static JsonObject buildFilterQueryForField(String fieldName) {
JsonObject builder = new JsonObject();
JsonObject nestedObj = new JsonObject();
nestedObj.addProperty("field", fieldName);
builder.addProperty("exists", nestedObj.toString().replaceAll("\\\\", ""));
return builder;
}
Das Endziel dafür ist das Folgende:
{
"query":{
"bool":{
"filter":[
{
"exists": { "field": "user_id" }
},
{
"exists": { "field": "campaign_id" }
},
]
}
}
}
Lösung
Diese Escapezeichen sind erforderlich, da Sie tatsächlich ein anderes JSON-Objekt in den Zeichenfolgenwert für das exists
Feld einbetten. Anstatt zu verwenden addProperty
, sollten Sie builder.add("exists", nestedObj)
genau wie anderswo verwenden.
Beantwortet von – jtahlborn
Antwort geprüft von – Willingham (FixError Volunteer)