1

我有一個應用程序需要非常靈活的搜索功能。作爲其中的一部分,用戶需要能夠對多個文本字段進行全文搜索,但也需要通過多個數字字段進行過濾,這些數字字段會定期更新數據(有時會超過一次或兩次一分鐘)。這些數據存儲在NDB數據存儲區中。定期更新數據和搜索API

我目前使用搜索API來創建文檔對象和索引來搜索文本數據,我知道我也可以將數字值添加到這些文檔進行索引。但是,由於這些數字字段的動態特性,我會不斷更新(刪除並重新創建)搜索API索引的文檔。即使我允許搜索API在一段時間內使用較舊的數據,仍需要每天更新幾次。對我而言,這似乎不是一種有效的方式來存儲此數據進行搜索,特別是考慮到搜索查詢的數量將遠遠少於數據更新的數量。

有沒有一種有效的方式可以處理這種動態數據,比不斷修改搜索文檔更高效?

我對這個想法的唯一想法是實現一個兩步過程,在這個過程中,全文搜索的結果可以用在針對NDB數據存儲的查詢中,或者使用Python手動過濾。這兩個都不是理想的,但我沒有想法。預先感謝您的幫助。

回答

2

確實,Search API的文檔可以包含數字數據,並且可以很容易地進行更新,但正如您所說,如果您正在進行大量更新,那麼修改文檔可能不是最佳選擇經常。

您可能會考慮的一種設計是將數字數據存儲在數據存儲實體中,但也大量使用緩存 - memcache或後端內存中緩存。交叉引用文檔及其相關實體(即,設計實體以包含具有關聯文檔ID的字段,並且文檔包含具有關聯實體鍵的字段)。如果您的應用程序域使得doc ID和數據存儲實體鍵名可以是相同的字符串,那麼這更直接。

然後,在緩存中,通過doc ID索引數字字段信息。這可以讓您有效地獲取查詢檢索到的文檔的關聯數字信息。您當然需要在數據存儲實體的更新上管理緩存。

只要緩存的大小不需要過大,就可以很好地工作。

如果您的doc ID和關聯的實體鍵名稱可以是相同的字符串,那麼我認爲您可能能夠利用ndb的緩存支持來做到這一點。

+0

我的主要困境是使用這些數值進一步過濾結果。因此,如果我需要根據數值進一步縮小結果範圍,那麼我應該只使用這個緩存數據,遍歷結果集中的每組值,並使用緩存中的相關數值數據,並使用標準Python邏輯比較以消除不符合crtieria的結果? – Twistieman 2012-08-17 00:19:05

+0

對不起,我錯過了你想過濾數字字段。在這種情況下,它基本上歸結爲執行應用程序級連接。 (或者,保留搜索文檔中的所有信息)。但是,如果可能的話,您希望利用數據存儲的查詢引擎。 因此,一種方法是基於數字過濾器對實體進行僅鍵查詢,然後根據文本查詢返回的文檔檢查該鍵列表,拋出與實體不相交的任何文檔關鍵列表。然後,對於通過該過濾器的文檔,從緩存中獲取關聯的數字數據。 – 2012-08-17 01:31:40

+0

我上面評論的附錄 - 如果你的實體查詢返回了一個可管理的小結果集,那麼這種方法將是可行的。如果不是,並且如果doc結果集比實體查詢結果小得多,則可能會更好(如您所建議的那樣)將doc id約束推送到數據存儲區查詢。 – 2012-08-17 02:44:29