2017-02-04 30 views
2

我試圖用Xapian實現搜索。我的文檔有自己的ID,即字符串。我已經按照tutorail說:如何在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的恢復僅僅是一個簡單的數字。 任何人都知道我是否應該做別的事情?

+0

希望我的回答有幫助;如果你還有其他問題需要解決,那麼通常可以通過我們的郵件列表或IRC幫助你。 –

回答

0

Xapian的文件ID始終是數字,但它提供了一種機制,爲您逐項以及由ID地址的文件。因此,replace_document()delete_document()可以像您所做的那樣被賦予一個字符串,並且它們將查找與該術語匹配的所有現有文檔,並將其從數據庫中刪除。然後replace_document()將創建一個新文檔,重新使用最低匹配(數字)文檔ID,或者如果沒有文檔匹配,則使用新ID。

documentation for this variant of replace_document()說:

一個常見的用途是允許從其他系統的UID很容易被映射到的Xapian條款。請注意,此方法不會自動將unique_term作爲術語添加,因此在以這種方式使用replace_document()時,您需要先撥打document.add_term(unique_term)

如果您使用QueryParser,或者以其他方式下,很多的Xapian系統遵循term prefixing convention,那麼它的普遍使用Q作爲前綴。這意味着你可能需要調用replace_document()之前做到以下幾點:

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

然後,當你查詢數據庫,你需要再次得到您的文檔ID了。您可以通過從術語表中讀取來做到這一點,但這有點煩瑣,因此在Document數據中存儲「外部」ID(Xapian外部)更爲常見。 (我經常在那裏存儲JSON,爲我需要的內容提供一些增長空間;例如,包含在文檔數據中顯示搜索結果所需的所有信息有時會很有用)。

這種方法是涵蓋在Xapian's FAQ on working with existing unique ids,特別是第二部分,「使用外部唯一ID的術語」。

相關問題