2017-08-04 32 views
0

我們有一個使用MarkLogic node.js的搜索應用程序。我們使用parsedQuery這樣的:MarkLogic node.js - 是否可以在parseBindings中支持派生值?

  qb.parsedFrom(prop.search, 
      qb.parseBindings(
       qb.word('name', qb.bind('name')), 
       qb.word('birthdate', qb.bind('birthdate')), 
       qb.range('count', qb.datatype('float'), qb.bind('count')) 
      ) 
     ) 

以上目前支持的搜索語法,如「數GT 50」等,我們願意支持使用派生的值,如年齡搜索。也就是說,我們希望支持像「年齡GT 10」這樣的搜索語法,其中年齡值不存儲在數據庫中的文檔中,而是需要根據生日中的實時計算。我們不能將年齡存儲在文檔中,因爲年齡因當前日期而異。

這是可能的,如果是這樣,如何?如果它的事項,我們正在使用ML8

回答

2

要做到這一點的方法是用custom constraint。解析函數根據參數構造一個cts查詢。爲了支持像「時代GT 10」,你想建立類似

cts:element-range-query(
    xs:QName("date-of-birth"), "<=", 
    fn:current-date() - xs:yearMonthDuration("P10Y") 
) 

你需要在date-of-birth日期範圍索引。

構建該自定義約束後,可以從MarkLogic Node.js客戶端API調用該約束。見Using a Custom Constraint Parser。節點開發者指南中也有一個example

+1

Dave的另一個好建議是對客戶中的標準進行計算。在這個例子中,如果你想找到一個大於10的年齡,你會搜索一個小於過去10年的日期。 – ehennum

+1

另一個腳註 - 如果您想根據聚合進行過濾,例如對一組行進行計數或求和,則可以在MarkLogic 9中使用Optic。 – ehennum

0

你應該能夠改變,以這種方式結合:

qb.word('birthdate', qb.bind('age')) 

但我認爲你不能改變qb.word到qb.value()作爲birthdate的格式與您想搜索的格式不同(例如1990-01-01 vs 20)。你能確認嗎?

+0

是的,這正是問題所在。年齡值不存儲在文檔中,需要隨時派生(因爲顯然年齡取決於當前日期)。我會更新這個問題,使其更清楚 –

相關問題