如何在 Optic API 中使用 fn:contains(), fn:starts-with() 和 fn:ends-with
How to use fn:contains(), fn:starts-with() and fn:ends-with in Optic API
之前我们使用 FLOWR 查询来满足我们的搜索需求,因为数据每天都在增加,所以我们决定使用索引来获得更好的搜索性能。
工作 FLOWR 查询(仅示例)
for $doc in collection("col1")
where fn:contains($doc//entityName/text(), "USA")
return document-uri($doc)
以上查询有效,它 returns 一个文档 URI,现在我们正在尝试使用 Optic API 来满足相同的要求。
我们已经为 entityName 创建了元素范围索引,但不确定如何将上述 FLOWR 查询转换为光学查询。
上面的 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()
。一般来说,Optic 表达式可以使用一个函数,如果它都
- 是内置的 - 换句话说,不需要导入或 require
- 仅将其输入转换为输出 - 换句话说,是纯功能性的,没有副作用或环境敏感性
另请参阅此表达式函数列表:
https://docs.marklogic.com/guide/app-dev/OpticAPI#id_69308
希望对您有所帮助,
之前我们使用 FLOWR 查询来满足我们的搜索需求,因为数据每天都在增加,所以我们决定使用索引来获得更好的搜索性能。
工作 FLOWR 查询(仅示例)
for $doc in collection("col1")
where fn:contains($doc//entityName/text(), "USA")
return document-uri($doc)
以上查询有效,它 returns 一个文档 URI,现在我们正在尝试使用 Optic API 来满足相同的要求。
我们已经为 entityName 创建了元素范围索引,但不确定如何将上述 FLOWR 查询转换为光学查询。
上面的 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()
。一般来说,Optic 表达式可以使用一个函数,如果它都
- 是内置的 - 换句话说,不需要导入或 require
- 仅将其输入转换为输出 - 换句话说,是纯功能性的,没有副作用或环境敏感性
另请参阅此表达式函数列表:
https://docs.marklogic.com/guide/app-dev/OpticAPI#id_69308
希望对您有所帮助,