Vespa 访客索引文档
我想为 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;
}
}
另一个想法是获取我当前正在处理的存储桶数量和存储桶 ID,并使用此模式进行增量:
document_id = bucket_id
document_id += bucked_count
这会起作用(如果我可以确保我的访问者一次对一个存储桶进行操作)但我不知道如何从访问者那里获取这些信息。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
文档处理器对传入文档写入进行操作,因此它们不能应用于访问结果(无论如何都需要更多设置)。
要访问文档,您可以做的就是使用 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。
Document processors operate on incoming document writes, so they cannot be applied to the result of visiting (not without a bit more setup anyway).
What you can do to visit the documents instead is to just get all the documents using HTTP/2: https://docs.vespa.ai/en/reference/document-v1-api-reference.html#visit
Then use the same API to issue an update operation for each document to set the field using the same API: https://docs.vespa.ai/en/reference/document-v1-api-reference.html#put
Since this is done by a single process, you can then have a document_id counter which assigns unique values.
As an aside, a common trick to avoid that requirement is to generate an UUID for each document.