如何在Xapian中使用不同的ID?

时间:2017-02-04 12:47:58

标签: python xapian

我正在尝试使用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只是一个简单的数字。 任何人都知道我是否应该做别的事情?

1 个答案:

答案 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的术语”。