private void insertFunctionRange(DescriptionManager manager, ExecutableRecord exeRecord,
			RowKeyElastic exeKey, String exeId, Iterator<FunctionDescription> iter, int maxNumber)
			throws ElasticException {
		StringBuilder builder = new StringBuilder();
		do {
			FunctionDescription desc = iter.next();
			builder.append("{ \"create\": { \"_index\": \"")
					.append(repository)
					.append("_executable\", ");
			builder.append("\"_id\": \"");
			exeKey.generateFunctionId(builder, desc);
			builder.append("\", \"routing\": \"");
			builder.append(exeId).append("\"}}\n");
			builder.append("{ \"name_func\": \"");
			builder.append(escape(desc.getFunctionName()));
			SignatureRecord sigRec = desc.getSignatureRecord();
			long vecid = 0;
			if (sigRec != null) {
				vecid = sigRec.getVectorId();
			}
			builder.append("\", \"id_signature\": \"");
			Base64Lite.encodeLongBase64(builder, vecid);
			builder.append("\", \"flags\": ").append(desc.getFlags());
			builder.append(", \"addr\": ").append(desc.getAddress());
			if (info.trackcallgraph) {
				List<String> vals = generateChildIds(manager, desc);
				if (vals != null) {
					builder.append(", \"childid\": [");
					boolean needComma = false;
					for (String val : vals) {
						if (needComma) {
							builder.append(',');
						}
						builder.append('\"').append(val).append('\"');
						needComma = true;
					}
					builder.append(" ]");
				}
			}
			builder.append(", \"join_field\": { ");
			builder.append("\"name\": \"function\", ");
			builder.append("\"parent\": \"");
			builder.append(exeId).append("\"}}\n");
			maxNumber -= 1;
			if (maxNumber <= 0) {
				break;
			}
		}
		while (iter.hasNext());
		connection.executeBulk("/_bulk", builder.toString());
	}
Insert a range of FunctionDescription documents into the index.
Documents are stored in the "executable" index
@param manager is the container of the FunctionDescription objects
@param exeRecord is the single executable containing the functions
@param exeKey is the precomputed key of the executable
@param exeId is the executable key encoded as a document id String
@param iter is an iterator to the FunctionDescriptions to insert
@param maxNumber is the (maximum) number of FunctionDescriptions to insert
@throws ElasticException if there are problems communicating with the server
Ghidra/Features/BSim/src/main/java/ghidra/features/bsim/query/elastic/ElasticDatabase.java