private JsonObject queryFuncNameAddress(String exeId, String functionName, long address)
			throws ElasticException {
		StringBuilder buffer = new StringBuilder();
		buffer.append("{ \"_source\": { \"excludes\": [ \"childid\" ] }");
		buffer.append(", \"query\": {");
		buffer.append("    \"bool\": {");
		buffer.append("      \"must\": {");
		buffer.append("        \"term\": {");
		buffer.append("          \"name_func\": \"");
		buffer.append(escape(functionName));
		buffer.append("\"},");
		buffer.append("        \"term\": {");
		buffer.append("           \"addr\": ").append(address);
		buffer.append("} },");
		buffer.append("      \"filter\": {");
		buffer.append("        \"parent_id\": {");
		buffer.append("          \"type\": \"function\",");
		buffer.append("          \"id\": \"").append(exeId);
		buffer.append("\"} } } } }");
		JsonObject resp = connection.executeStatement(ElasticConnection.GET, "executable/_search",
			buffer.toString());
		JsonObject baseHits = (JsonObject) resp.get("hits");
		JsonObject totalRec = (JsonObject) baseHits.get("total");
		long total = totalRec.get("value").getAsLong();
		if (total != 1) {
			return null;
		}
		JsonArray hitsArray = (JsonArray) baseHits.get("hits");
		return (JsonObject) hitsArray.get(0);
	}
Query for function documents matching a given executable,
a given function name, and a given function address. These 3 things
should always identify a function uniquely within the database, so at
most 1 document should be returned
@param exeId is the document id of the executable to match
@param functionName is the name of the function to match
@param address is the address of the function to match
@return the JSON function document or null if none match
@throws ElasticException for communication problems with the server
Ghidra/Features/BSim/src/main/java/ghidra/features/bsim/query/elastic/ElasticDatabase.java