簡要紀錄,最近遇到在 parent document 裡使用 weightedSet 做資料篩選的時候,本來還沒加 weightedSet 時,latency 是大約 25ms,加了 weightedSet 之後變成大約 730ms。
以下是當時的 schema 設定,簡要來說就是有個讓多個 child document 共用的欄位,叫做 sharedField
,它被 child document 繼承時,欄位名字會叫做 fieldInParentDoc
。
# Schema in parent document.
field sharedField type weightedset<string> {
indexing: attribute
attribute: fast-search
}
# Schema in child document
field id type string {
indexing: attribute
attribute: fast-search
}
field parentReference type reference<parent_doc> {
indexing: attribute
}
import field parentReference.sharedField as fieldInParentDoc {}
接著,在查詢時使用的 query 大約是這樣:
SELECT * FROM * sources WHERE (id contains "my_id_1" OR id contains "my_id_2") AND weightedSet(fieldInParentDoc, {"my_key":1});
實際上 ID 欄位是唯一值,並且 query 當中會有 5 個 ID,所以搜尋結果一定只會有 5 筆紀錄。理論上這應該會是很快的 query,但在加上後半段的 parent document 篩選條件後,速度就爆增了 28 倍。
不過如果幫這個 parent document 欄位設定 rank: filter
,如下所示,讓它改成 bit vector 的形式,速度會變快不少。具體來說,專案裡測試的結果是會從 730ms 變成約 90ms。雖然還是很慢,但至少勉強還過得去…。
# Schema in parent document.
field sharedField type weightedset<string> {
indexing: attribute
attribute: fast-search
rank: filter
}