如何使用MarkLogic Optic API创建搜索代码段



我正在学习如何使用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)
}))

最新更新