如何基于 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>
我有以下查询,我想从列表中形成一个值字符串,我想将该逗号分隔的字符串用作 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>