早先我们使用FLOWR查询来满足我们的搜索需求,因为数据每天都在增加,所以我们决定使用索引来提高搜索性能。
工作流程查询(仅示例)
for $doc in collection("col1")
where fn:contains($doc//entityName/text(), "USA")
return document-uri($doc)
上面的查询正在工作,它返回一个文档URI,现在我们尝试使用Optic API来满足相同的要求。
我们为entityName创建了一个元素范围索引,但是不确定如何将上述FLOWR查询转换为Optic Query。
对于上述FLOWR查询,等效的光学查询将是什么?,而且将来我们也计划使用fn:starts-with()和fn:ends-with()函数。
我们正在使用MarkLogic 10.0-2.1
任何帮助表示赞赏
创建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()
在查询执行期间,第一个过滤列的值where()
将实体行约束为匹配的源文档joinDocUri()
加入基于实体行的源文件的URI词汇select()
项目的“URI”列中,忽略了不必要的视图列。joinDocUri()
是一个方便
.joinInner(
op.fromLexicons({'uri':cts.uriReference()}, '', op.fragmentIdCol('uriDocId')),
op.on(op.fragmentIdCol('docId'), op.fragmentIdCol('uriDocId'))
)
光学表达功能还包括op.fn.startsWith()
和op.fn.endsWith()
。通常,光学表达式可以同时使用函数
另请参见以下表达式函数列表:
https://docs.marklogic.com/guide/app-dev/OpticAPI#id_69308
希望能有所帮助,
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句