我正在尝试使用Xapian实现搜索。我的文档有自己的ID,即字符串。我已经按照tutorail的说法做了:
db.replace_document(doc.docno, doc_x)
其中doc.docno是标识文档的字符串。 但是当我搜索时:
for match in enquire.get_mset(0, 10):
print match.document.get_docid()
恢复的docid只是一个简单的数字。 任何人都知道我是否应该做别的事情?
答案 0 :(得分:0)
Xapian文档ID始终是数字,但它提供了一种机制,您可以按术语和ID来处理文档。因此,replace_document()
和delete_document()
可以像您一样给出一个字符串,他们将找到与该术语匹配的所有现有文档,并将其从数据库中删除。然后,replace_document()
将创建一个新文档,重新使用最低匹配(数字)文档ID,或者如果没有文档匹配则使用新ID。
documentation for this variant of replace_document()
说:
一个常见用途是允许来自另一个系统的UID轻松映射到Xapian中的术语。请注意,此方法不会自动将unique_term添加为术语,因此在以这种方式使用
document.add_term(unique_term)
时,您需要先调用replace_document()
。
如果您正在使用QueryParser
,或者以其他方式使用许多Xapian系统所遵循的term prefixing convention,那么通常会使用Q
作为前缀。这意味着您可能希望在致电replace_document()
之前执行以下操作:
doc_x.add_term('X' + doc.docno)
然后,当您查询数据库时,您需要再次获取文档ID。你可以通过阅读termlist来做到这一点,但这有点繁琐,因此在Document
数据中存储你的“外部”id(Xapian外部)更为常见。 (我经常在那里存储JSON,为我需要的东西提供一些扩展空间;例如,包含在文档数据中呈现搜索结果所需的所有信息有时会很有用。)
Xapian's FAQ on working with existing unique ids涵盖了这种方法,特别是第二部分“使用外部唯一ID的术语”。