2

我正在尝试使用 Xapian 实现搜索。我的文档有自己的 id,即字符串。我已经按照教程说的做了:

db.replace_document(doc.docno, doc_x)

其中 doc.docno 是标识文档的字符串。但是当我搜索时:

for match in enquire.get_mset(0, 10):
    print match.document.get_docid()

恢复的 docid 只是一个简单的数字。有人知道我是否应该做其他事情吗?

4

1 回答 1

0

Xapian 文档 ID 始终是数字,但是它提供了一种机制,让您可以按术语和 id 来处理文档。因此replace_document()delete_document()可以像您所做的那样给 and 一个字符串,他们将找到与该术语匹配的所有现有文档,并将它们从数据库中删除。replace_document()然后将创建一个新文档,重新使用最低匹配(数字)文档 id,或者如果没有文档匹配,则使用新 id。

这个变体的文档replace_document()说:

一个常见的用途是允许来自另一个系统的 UID 轻松地映射到 Xapian 中的术语。请注意,此方法不会自动将 unique_term 添加为术语,因此document.add_term(unique_term)在使用时需要先调用replace_document()

如果您正在使用QueryParser,或者以其他方式遵循许多 Xapian 系统遵循的术语前缀约定,那么通常Q用作前缀。这意味着您可能希望在调用之前执行以下操作replace_document()

doc_x.add_term('X' + doc.docno)

然后,当您查询数据库时,您需要再次获取您的文档 ID。您可以通过从术语列表中读取来做到这一点,但这有点繁琐,因此将您的“外部”ID(Xapian 外部)存储在Document数据中更为常见。(我经常将 JSON 存储在其中,以便为我需要的内容提供一些增长空间;例如,在文档数据中包含呈现搜索结果所需的所有信息有时会很有用。)

Xapian 的关于使用现有唯一 ID 的常见问题解答中介绍了这种方法,特别是第二部分“使用外部唯一 ID 的术语”。

于 2017-02-04T20:26:39.510 回答