Skip to main content

Documentation Index

Fetch the complete documentation index at: https://support.agentrank.io/llms.txt

Use this file to discover all available pages before exploring further.

Overview

The Document API provides programmatic access to read and write documents in Vespa. It supports four core operations:
  • Put - Add or replace a document
  • Get - Retrieve a document by ID
  • Update - Modify specific fields in a document
  • Remove - Delete a document

Document Operations

Vespa provides both synchronous and asynchronous interfaces for document operations.

AsyncSession

The AsyncSession interface provides high-throughput asynchronous access:
import com.yahoo.documentapi.AsyncSession;
import com.yahoo.documentapi.DocumentAccess;
import com.yahoo.document.Document;
import com.yahoo.document.DocumentId;
import com.yahoo.document.DocumentPut;
import com.yahoo.document.DocumentUpdate;

DocumentAccess access = DocumentAccess.createDefault();
AsyncSession session = access.createAsyncSession(new AsyncParameters());
Reference: documentapi/src/main/java/com/yahoo/documentapi/AsyncSession.java:24

Put Operation

Add or completely replace a document:
import com.yahoo.document.Document;
import com.yahoo.document.DocumentType;

// Create document
DocumentType musicType = docTypeManager.getDocumentType("music");
Document doc = new Document(musicType, "id:mynamespace:music::song1");
doc.setFieldValue("title", "Bohemian Rhapsody");
doc.setFieldValue("artist", "Queen");
doc.setFieldValue("year", 1975);

// Put document
Result result = session.put(doc);
if (result.isSuccess()) {
    System.out.println("Document added successfully");
}
Reference: documentapi/src/main/java/com/yahoo/documentapi/AsyncSession.java:37

Put with Conditions

Conditional puts using test-and-set:
import com.yahoo.document.DocumentPut;
import com.yahoo.documentapi.DocumentOperationParameters;
import static com.yahoo.documentapi.DocumentOperationParameters.parameters;

DocumentPut put = new DocumentPut(doc);
put.setCondition(new TestAndSetCondition("music.year < 1980"));

DocumentOperationParameters params = parameters()
    .withResponseHandler(responseHandler);

Result result = session.put(put, params);
Reference: documentapi/src/main/java/com/yahoo/documentapi/AsyncSession.java:50-68

Get Operation

Retrieve a document by its ID:
import com.yahoo.document.DocumentId;

DocumentId id = new DocumentId("id:mynamespace:music::song1");
Result result = session.get(id);

// Process response asynchronously
responseHandler.waitForResponse().ifPresent(response -> {
    if (response instanceof DocumentResponse) {
        DocumentResponse docResp = (DocumentResponse) response;
        Document doc = docResp.getDocument();
        if (doc != null) {
            System.out.println("Title: " + doc.getFieldValue("title"));
        }
    }
});
Reference: documentapi/src/main/java/com/yahoo/documentapi/AsyncSession.java:82

Get with Field Set

Retrieve only specific fields:
import com.yahoo.documentapi.DocumentOperationParameters;

DocumentOperationParameters params = parameters()
    .withFieldSet("music:title,artist"); // Only fetch title and artist

Result result = session.get(id, params);
Using field sets reduces network bandwidth and improves performance by fetching only needed fields.
Reference: documentapi/src/main/java/com/yahoo/documentapi/AsyncSession.java:97-99

Update Operation

Modify specific fields without replacing the entire document:
import com.yahoo.document.DocumentUpdate;
import com.yahoo.document.update.FieldUpdate;
import com.yahoo.document.Field;

DocumentType musicType = docTypeManager.getDocumentType("music");
DocumentUpdate update = new DocumentUpdate(musicType, "id:mynamespace:music::song1");

// Assign new value to a field
Field yearField = musicType.getField("year");
FieldUpdate fieldUpdate = FieldUpdate.createAssign(yearField, 1975);
update.addFieldUpdate(fieldUpdate);

// Execute update
Result result = session.update(update);
Reference: documentapi/src/main/java/com/yahoo/documentapi/AsyncSession.java:162

Update with Parameters

Add conditions and options to updates:
import com.yahoo.documentapi.DocumentOperationParameters;

DocumentOperationParameters params = parameters()
    .withCondition("music.year > 0")  // Only update if condition matches
    .withCreateIfNonExistent(true)     // Create document if missing
    .withResponseHandler(handler);

Result result = session.update(update, params);
Reference: documentapi/src/main/java/com/yahoo/documentapi/AsyncSession.java:177-179

Remove Operation

Delete a document:
import com.yahoo.document.DocumentId;

DocumentId id = new DocumentId("id:mynamespace:music::song1");
Result result = session.remove(id);

if (result.isSuccess()) {
    System.out.println("Document removed");
}
Reference: documentapi/src/main/java/com/yahoo/documentapi/AsyncSession.java:114

Conditional Remove

Remove only if a condition is met:
import com.yahoo.document.DocumentRemove;

DocumentRemove remove = new DocumentRemove(id);
remove.setCondition(new TestAndSetCondition("music.year < 1970"));

DocumentOperationParameters params = parameters();
Result result = session.remove(remove, params);
Reference: documentapi/src/main/java/com/yahoo/documentapi/AsyncSession.java:146-148

Response Handling

Document operations return responses asynchronously:
import com.yahoo.documentapi.Response;
import com.yahoo.documentapi.DocumentResponse;
import com.yahoo.documentapi.RemoveResponse;
import com.yahoo.documentapi.DocumentUpdateResponse;

ResponseHandler handler = new ResponseHandler() {
    @Override
    public void handleResponse(Response response) {
        if (response.isSuccess()) {
            if (response instanceof DocumentResponse) {
                DocumentResponse docResp = (DocumentResponse) response;
                Document doc = docResp.getDocument();
                // Process document
            } else if (response instanceof DocumentUpdateResponse) {
                DocumentUpdateResponse updateResp = (DocumentUpdateResponse) response;
                System.out.println("Update successful");
            } else if (response instanceof RemoveResponse) {
                RemoveResponse removeResp = (RemoveResponse) response;
                System.out.println("Document removed");
            }
        } else {
            System.err.println("Operation failed: " + response.getTextMessage());
        }
    }
};

Document ID Structure

Vespa document IDs follow a specific format:
id:<namespace>:<document-type>:<key-location>:<user-specific>

ID Components

Logical grouping for documents. Typically your application name.Example: id:mynamespace:music::song1
Must match a document type defined in your schema.Example: id:mynamespace:music::song1
Optional field for data distribution. Can be:
  • n=<number> - Numeric location
  • g=<group> - String-based grouping
Example: id:mynamespace:music:n=123:song1
Your unique identifier for the document.Example: id:mynamespace:music::song1

Document ID Examples

// Simple ID
new DocumentId("id:music:song::song1")

// With numeric location (for co-locating related documents)
new DocumentId("id:music:song:n=12345:song1")

// With group location
new DocumentId("id:music:song:g=rock:song1")

Synchronous Session

For simpler use cases, use SyncSession for blocking operations:
import com.yahoo.documentapi.SyncSession;
import com.yahoo.documentapi.SyncParameters;

SyncSession session = access.createSyncSession(new SyncParameters.Builder().build());

// Put document (blocks until complete)
session.put(document);

// Get document
Document doc = session.get(id);
if (doc != null) {
    System.out.println("Found: " + doc.getId());
}

// Update document
session.update(update);

// Remove document
boolean removed = session.remove(id);
SyncSession blocks the calling thread. For high-throughput applications, use AsyncSession instead.

Document Operation Parameters

Customize operations with various parameters:
import com.yahoo.documentapi.DocumentOperationParameters;
import static com.yahoo.documentapi.DocumentOperationParameters.parameters;

DocumentOperationParameters params = parameters()
    .withPriority(DocumentProtocol.Priority.HIGH_1)  // Set priority
    .withRoute("default")                             // Specify route
    .withTimeout(30000)                               // Timeout in ms
    .withCondition("music.year > 1970")              // Test-and-set condition
    .withFieldSet("music:title,artist")              // Field set for get
    .withTraceLevel(5);                              // Enable tracing

session.put(document, params);

Window Size and Flow Control

The async session uses a window-based flow control mechanism:
// Get current send window size
double windowSize = session.getCurrentWindowSize();

System.out.println("Current window size: " + windowSize);
The window size adjusts dynamically based on:
  • Latency of responses
  • Success/failure rate
  • Server back-pressure signals
Reference: documentapi/src/main/java/com/yahoo/documentapi/AsyncSession.java:186

Error Handling

Handle various error conditions:
Result result = session.put(document);

if (!result.isSuccess()) {
    System.err.println("Operation failed: " + result.getError());
    
    switch (result.getError().getType()) {
        case TRANSIENT:
            // Retry operation
            retry(document);
            break;
        case FATAL:
            // Permanent error, don't retry
            logError(document, result.getError());
            break;
    }
}

Best Practices

1
Use Async Sessions for Throughput
2
For high-volume feeding, always use AsyncSession to maximize throughput:
3
AsyncSession session = access.createAsyncSession(new AsyncParameters());
4
Batch Operations
5
Send multiple operations without waiting for individual responses:
6
for (Document doc : documents) {
    session.put(doc);  // Don't wait for response
}
7
Set Appropriate Timeouts
8
Configure timeouts based on your latency requirements:
9
DocumentOperationParameters params = parameters()
    .withTimeout(5000);  // 5 second timeout
10
Use Field Sets to Minimize Data Transfer
11
Fetch only required fields:
12
DocumentOperationParameters params = parameters()
    .withFieldSet("music:title,artist");
session.get(id, params);

See Also