【问题标题】:How to keep cts:highlight from matching inside XML tags?如何防止 cts:highlight 在 XML 标记内匹配?
【发布时间】:2015-12-10 10:50:29
【问题描述】:

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

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

我创建了一个包含根节点“resources”和子元素“title”和“desc”的文档,并使用 word-query 在文档中搜索搜索字符串。

现在,当我搜索“some me”时,它会检索类似

的内容
         <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:highlight 进行突出显示,例如:

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

关于为什么此处突出显示 html 元素的任何想法? 提前致谢。

【问题讨论】:

    标签: api rest search highlight marklogic


    【解决方案1】:

    您可能以文本格式插入文档,而不是 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:highlight:

    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:highlight 效果更好:

    <?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>
    

    【讨论】:

    • 对于那些想知道为什么除了“me”之外还突出显示“i”的人,那是因为“i”是“me”的词干,并且数据库可能默认配置为使用词干搜索.您可以通过在 word-query 中添加 unstemmedexact 选项来抑制它。
    • 同意,除非将 xml 标签视为纯文本,否则不应搜索它们。说得好。
    【解决方案2】:

    这是什么版本的 MarkLogic?

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

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

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

    【讨论】:

      【解决方案3】:

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

      也就是说,而不是

      fn:concat('<span class="highlight">',$cts:text,'</span>')
      

      试试

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

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

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

      希望对您有所帮助,

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多