如何基于 MarkLogic 中的一组带引号的字符串动态创建搜索查询

How to dynamically create a search query based on a set of quoted strings in MarkLogic

我有以下查询,我想从列表中形成一个值字符串,我想将该逗号分隔的字符串用作 or-query 但它没有给出任何结果,但是当我 return 只是连接的字符串,它给出了查询所需的确切值。

查询如下:

 xquery version "1.0-ml";
 declare namespace html = "http://www.w3.org/1999/xhtml";


 declare variable $docURI as xs:string external ;
 declare variable $orQuery as xs:string external ;

 let $tags :=
 <tags>
  <tag>"credit"</tag>
  <tag>"bank"</tag>
  <tag>"private banking"</tag>
 </tags>


 let $docURI := "/2012-10-22_CSGN.VX_(Citi)_Credit_Suisse_(CSGN.VX)__Model_Update.61198869.xml"
 let $orQuery :=  (string-join($tags/tag, ','))


 for $x in cts:search(doc($docURI)/doc/Content/Section/Paragraph, cts:or-query(($orQuery)))


 let $r := cts:highlight($x, cts:or-query($orQuery), <b>{$cts:text}</b>)

 return <result>{$r}</result>

我想要 运行 的确切查询是:

  cts:search(doc($docURI)/doc/Content/Section/Paragraph, cts:or-query(("credit","bank","private banking")))

当我这样做时

 return (string-join($tags/tag, ','))

它完全满足了我的需求

 "credit","bank","private banking"

但是为什么 return or-query 没有任何结果?

字符串连接步骤不需要是字符串连接。它传入一个文字字符串。在 xQuery 中,序列是你的朋友。

我想你想做这样的事情:

let $tags-to-search :=  ($tags/tag/text()!replace(., '^"|"$', '') ) (: a sequence of tags :)
cts:search(doc($docURI)/doc/Content/Section/Paragraph, cts:word-query($tags-to-search))

cts:word-query是如果你传入一个字符串的话,search的参数2默认使用的query。 cts:word 查询也 returns 匹配序列中的任何项目(如果有的话)。

https://docs.marklogic.com/cts:word-query

编辑: 添加了 Abel 建议的引号替换步骤。这是特定于原始问题所提供的数据。总体方法保持不变。

也许你需要这样的东西 let $orQuery := for $tag in $tags/tag return cts:word-query($tag)

我使用了 fn:tokenize 而不是它非常适合我的用例 这是因为我试图使用 XCC api 从 java 传递这些参数,它不会 return 任何带有字符串值

的东西
  xquery version "1.0-ml";
  declare namespace html = "http://www.w3.org/1999/xhtml";

  declare variable $docURI as xs:string external ;
  declare variable $orQuery as xs:string external ;

  let $input := "credit,bank"
  let $tokens := fn:tokenize($input, ",") 

  let $docURI := "2012-11-19 0005.HK (Citi) HSBC Holdings Plc (0005.HK)_ Model Update.61503613.pdf"

  for $x in cts:search(fn:doc($docURI), cts:or-query(($tokens)))

  let $r := cts:highlight($x, cts:or-query(($tokens)), <b>{$cts:text}</b>)

  return <result>{$r}</result>