MarkLogic node.js - 是否可以在 parseBindings 中支持派生值?
MarkLogic node.js - is it possible to support a derived value in parseBindings?
我们有一个使用 MarkLogic node.js 的搜索应用程序。我们像这样使用 parsedQuery:
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'))
)
)
以上目前支持"count GT 50"等搜索语法。我们希望支持使用派生值(如年龄)进行搜索。也就是说,我们希望支持像 "age GT 10" 这样的搜索语法,其中年龄值不存储在数据库中的文档中,而是需要根据出生日期动态计算。我们无法将年龄存储在文档中,因为年龄会根据当前日期发生变化。
这可能吗?如果可能,怎么做?如果重要的话,我们正在使用 ML8
您应该可以通过这种方式更改该绑定:
qb.word('birthdate', qb.bind('age'))
但我认为您不能将 qb.word 更改为 qb.value(),因为生日的格式与您要搜索的格式不同(1990-01-01 与 20例如)。能否确认一下?
方法是使用 custom constraint。 parse 函数根据参数构造一个cts 查询。要支持像 "age 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. There's an example。
我们有一个使用 MarkLogic node.js 的搜索应用程序。我们像这样使用 parsedQuery:
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'))
)
)
以上目前支持"count GT 50"等搜索语法。我们希望支持使用派生值(如年龄)进行搜索。也就是说,我们希望支持像 "age GT 10" 这样的搜索语法,其中年龄值不存储在数据库中的文档中,而是需要根据出生日期动态计算。我们无法将年龄存储在文档中,因为年龄会根据当前日期发生变化。
这可能吗?如果可能,怎么做?如果重要的话,我们正在使用 ML8
您应该可以通过这种方式更改该绑定:
qb.word('birthdate', qb.bind('age'))
但我认为您不能将 qb.word 更改为 qb.value(),因为生日的格式与您要搜索的格式不同(1990-01-01 与 20例如)。能否确认一下?
方法是使用 custom constraint。 parse 函数根据参数构造一个cts 查询。要支持像 "age 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. There's an example。