更早的时候,我们使用FLOWR查询来满足我们的搜索需求,因为数据日益增加,所以我们决定使用索引来提高搜索性能。
工作流程查询(仅示例)
for $doc in collection("col1")
where fn:contains($doc//entityName/text(), "USA")
return document-uri($doc)上面的查询是工作的,它返回一个文档URI,现在我们尝试使用Optic来满足同样的需求。
我们已经为entityName创建了元素范围索引,但不确定如何将上面的FLOWR查询转换为Optic查询。
,对于上面的FLOWR查询,什么是等价的Optic ?,将来我们也计划使用fn:starts with()和fn: and with()函数。
我们使用的是MarkLogic 10.0-2.1
任何帮助都是非常感谢的。
发布于 2021-01-27 17:27:43
在创建TDE以投影实体属性之后,等效的Optic查询将类似于XQuery中的以下内容:
op:from-view(null, VIEW_NAME, '', op:fragment-id-col('docId'))
=> op:where(ofn:contains(op:col('entityName', 'USA'))
=> op:where(cts:collection-query(COLLECTION_NAME))
=> op:join-doc-uri('uri', op:fragment-id-col('docId'))
=> op:select('uri')
=> op:result()在XQuery中,必须导入ofn库。
在SJS中,op.fn字段提供了等价的函数:
op.fromView(null, VIEW_NAME, '', op.fragmentIdCol('docId'))
.where(op.fn.contains(op.col('entityName', 'USA'))
.where(cts.collectionQuery(COLLECTION_NAME))
.joinDocUri('uri', op.fragmentIdCol('docId'))
.select('uri')
.result()所使用的行动:
fromView()访问实体视图where()过滤器约束实体行匹配源documentsjoinDocUri()基于实体行select()项目' URI‘列,忽略不必要的视图列。<代码>G 220
joinDocUri()是一个方便
.joinInner(
op.fromLexicons({'uri':cts.uriReference()}, '', op.fragmentIdCol('uriDocId')),
op.on(op.fragmentIdCol('docId'), op.fragmentIdCol('uriDocId'))
)光学表达式函数还包括op.fn.startsWith()和op.fn.endsWith()。一般来说,Optic表达式可以使用一个函数,如果两者都使用
。
还请参见以下表达式函数列表:
https://docs.marklogic.com/guide/app-dev/OpticAPI#id_69308
希望这有帮助,
https://stackoverflow.com/questions/65911520
复制相似问题