如何保持cts:从匹配内​​部XML标签突出显示?

时间:2015-12-10 10:50:30

标签: api rest search highlight marklogic

我正在尝试使用REST API搜索某些内容并突出显示MarkLogic中XML内容(如google)中的搜索字符串。问题是当我包括" ME"在搜索字符串中,它突出显示了' i'标签(html斜体标签)以及" Me"在内容中。我创建了一个包含一些元素的文档,并在文档上运行了单词查询。 例如XML内容:

         <resources>
         <title> some data from me</title>
         <desc> more data <i> from </i> somewhere by me </desc>
         </resources>

我创建了一个包含根节点资源的文档&#39;和儿童元素&#39;标题&#39;和&#39; desc&#39;并使用单词查询搜索文档中的搜索字符串。

现在,当我搜索&#34;某些我&#34; ,它检索像

这样的内容
         <resources>
         <title> <<span class="highlight">some</span> data from <<span class="highlight">me</span>
          </title>
         <desc> more data <<span class="highlight">i</span>> from <<span class="highlight">i</span>> somewhere by <span class="highlight">me</span>              </desc>
         </resources>

网址:

localhost:9000/v1/search?q=some me&collection=Data&start=0&pageLength=10&options=Transformation&format=json

我正在使用cts:突出显示突出显示,有些事情如下:

cts:highlight($final-result, $query, fn:concat('<span class="highlight">',$cts:text,'</span>')), $custom-config)

有关为什么html元素在此处突出显示的任何想法? 在此先感谢。

3 个答案:

答案 0 :(得分:5)

您可能以文本格式插入文档,而不是xml格式。我可以通过以文本格式插入来重现您的问题:

xdmp:document-insert("test.xml", text {"<resources>
     <title> some data from me</title>
     <desc> more data <i> from </i> somewhere by me </desc>
     </resources>"})

然后运行cts:突出显示该文档:

cts:highlight(doc("test.xml"), cts:parse("some me"), concat('<span class="highlight">', $cts:text, '</span>'))

但是如果我以XML格式重新插入文档:

xdmp:document-insert("test.xml", <resources>
     <title> some data from me</title>
     <desc> more data <i> from </i> somewhere by me </desc>
     </resources>)

然后相同的cts:突出显示效果更好:

<?xml  version="1.0" encoding="UTF-8"?>
<resources>
  <title> &lt;span class="highlight"&gt;some&lt;/span&gt; data from &lt;span class="highlight"&gt;me&lt;/span&gt;</title>
  <desc> more data <i> from </i> somewhere by &lt;span class="highlight"&gt;me&lt;/span&gt; </desc>
</resources>

如果我添加来自@ehennum和@mholstege的建议,而是运行此cts:highlight:

cts:highlight(doc("test.xml"), cts:parse("some me"), <span class="highlight">{$cts:text}</span>)

然后我得到了我猜你想要的东西:

<?xml version="1.0" encoding="UTF-8"?>
<resources>
  <title> <span class="highlight">some</span> data from <span class="highlight">me</span></title>
  <desc> more data <i> from </i> somewhere by <span class="highlight">me</span> </desc>
</resources>

答案 1 :(得分:1)

这是什么版本的MarkLogic?

你能提供一个更完整的例子吗?什么是$ custom-config例如? REST调用结果如何与cts相关联:突出显示?要以这种方式突出显示标记,结果必须是文本而不是XML。

顺便说一下,cts的第三个参数:highlight是一个表达式 - 如果你想创建标记,只需在那里使用构造函数,而不是字符串连接:

cts:highlight($final-result, $query, <span class="highlight">{$cts:text}</span>, $custom-config)

答案 2 :(得分:1)

尝试将cts:hightlight()表达式中的标记作为节点而不是字符串提供。

即代替

<span class="highlight">{$cts:text}</span>

catalog_category_product

有关详细信息,请参阅第一个示例:

http://docs.marklogic.com/cts:highlight?q=cts:highlight

希望有帮助,