我正在学习如何使用MarkLogic Optic API,到目前为止,它的灵活性给我留下了深刻印象。然而,我不知道如何生成类似于search.snippet
或jsearch输出的搜索片段。使用光学API有可能吗?
谢谢!
这取决于您搜索的内容/方式以及返回的结果。。没有将光学计划(通常由许多步骤和联接组成(转换为单个查询,该查询可以针对文档运行以创建有问题的片段。然而,如果您要将文档绑定到光学查询上,并有某种方法来隔离您想要摘录的内容,那么是的,这是可能的。请考虑下面的示例。请注意,它有两个语句(1(insert和(2(query。分号的位置对于查询控制台很重要。
几个注意事项:
-
可能有几个地方可以缝合。然而,根据最佳实践,我举了一个分页后高亮的例子。高亮显示、摘录和漫游等都是很有冲击力的功能,所以尽可能在分页后使用,
-
使用op:map((可以做到这一点,因为我可以提取文档并对其进行操作。人们可能会想在op:select或op:bind中也这样做。然而,即使cts:highlight在octs:highlight下可用(我没有检查(,我们也必须导入额外的库,并最终得到相同的结果。由于我只会在分页后应用它,所以我没有检查。但是,在应用op:map之后,并不能做太多的工作。
xquery version "1.0-ml"; ( xdmp:document-insert("/comment-1.xml",<doc><some-node><comment>Hello, I am a llama</comment></some-node></doc>), xdmp:document-insert("/comment-2.xml",<doc><some-node><comment>Hello, I am an emu</comment></some-node></doc>) ); (: ------------------------This is a separate statement started after the semicolon(;) avove ------------------------------------ :) xquery version "1.0-ml"; import module namespace op="http://marklogic.com/optic" at "/MarkLogic/optic.xqy"; let $query := cts:word-query("llama") return op:from-search-docs($query) =>op:offset-limit(1,10) =>op:map(function($row){ $row=>map:with("match", cts:highlight(map:get($row, "doc"), $query, <match>{$cts:text}</match>))}) =>op:result()
结果:原始文档:
<doc>
<some-node>
<comment>Hello, I am a llama</comment>
</some-node>
</doc>
突出显示:
<doc>
<some-node>
<comment>Hello, I am a <match>llama</match></comment>
</some-node>
</doc>
为了补充David的精彩回答,这里有另一种将search:snippet
作为后处理步骤的方法:
const query = cts.wordQuery('marklogic')
op
.fromSearchDocs(query)
.limit(10)
.select([
op.as('title', op.xpath(op.col('doc'), '/article/title/text()')),
op.as('keywords', op.xpath(op.col('doc'), '/article/keywords/keyword/text()')),
op.col('doc'),
])
.result()
.toArray()
.map(({doc, ...rest}) => ({
...rest,
snippets: search.snippet(doc, query)
}))