我想为vespa集群中的每个文档赋予一个ID。
但我不完全理解游客在vespa是如何工作的。
我可以获得一个共享字段(意思是由我的访问者的所有实例共享(吗?每次访问文档时,我都可以原子地递增(使用一些锁(?
我尝试的显然不起作用,但你会看到大致的想法:
public class MyVisitor extends DocumentProcessor {
// where should i put this ?
private int document_id;
private final Lock lock = new ReentrantLock();
@Override
public Progress process(Processing processing) {
Iterator<DocumentOperation> it = processing.getDocumentOperations().iterator();
while (it.hasNext()) {
DocumentOperation op = it.next();
if (op instanceof DocumentPut) {
Document doc = ((DocumentPut) op).getDocument();
/*
* Remove the PUT operation from the iterator so that it is not indexed back in
* the document cluster
*/
it.remove();
try {
try {
lock.lock();
document_id += 1;
} finally {
lock.unlock();
}
} catch (StatusRuntimeException | IllegalArgumentException e) {
}
}
}
return Progress.DONE;
}
}
另一个想法是获得我目前正在处理的bucket的数量和bucket id,并使用以下模式递增:
document_id = bucket_id
document_id += bucked_count
这是可行的(如果我能确保我的访客一次只在一个桶上操作(,但我不知道如何从我的访客那里获得这些信息。
文档处理程序对传入的文档写入进行操作,因此它们无法应用于访问结果(无论如何都需要更多的设置(。
您可以访问这些文档,只需使用HTTP/2获取所有文档:https://docs.vespa.ai/en/reference/document-v1-api-reference.html#visit
然后使用相同的API为每个文档发出更新操作,以使用相同的API设置字段:https://docs.vespa.ai/en/reference/document-v1-api-reference.html#put
由于这是由一个进程完成的,因此可以有一个document_id计数器来分配唯一的值。
顺便说一句,避免这种需求的一个常见技巧是为每个文档生成一个UUID。