我正在使用search:search
API。
在search options grammar
中,我使用引号为" '
"
<quotation>'</quotation>
现在,如果搜索字符串包含任何单引号,则会产生错误的cts:query
。
例如:"pubTitle:''test pub''"
对于pubTitle
我已经定义了element-word-query
的约束。
但由于单引号'
,它正在形成cts-word
次查询
更新
我有一个XML文件,如下所示
<root>
<pubTitle>'test''pu'b'</pubTitle>
<firstPage>12</firstPage>
<lastPage>45</lastPage>
</root>
约束定义:
<constraint name="pubTitle">
<value>
<element ns="" name="pubTitle"/>
</value>
</constraint>
现在我想在pubTitle元素中搜索带有文本'test''pu'b'
的文档。
我的搜索查询是什么? (search:search
第一个参数)
帮助!
答案 0 :(得分:1)
更新有助于澄清问题。您的内容包含单引号。
更确切地说,您希望搜索包含单引号,空格甚至可能是交互的标题。进行值搜索是有意义的,但是传入search:search
的搜索字符串会被解析。如果不将引号中的搜索值或短语包装起来,解析器将认为该值在下一个空格处结束。如果您没有更改<quotation>
选项,解析器将在''test
之后停止(在您给出的初始示例中)。
将<quotation>
更改为单引号会使事情变得更糟,因为您的搜索值也包含单引号,并且解析器会将它们混淆。如果search:search
最终在全文中搜索test
和pub
,这是默认行为,我不会感到惊讶。
如果你想手动调用search:search
,双引号引用也有点棘手。您需要双引号来包装搜索值,还需要定义整个搜索字符串。您可以通过将内部双引号加倍,将它们写为"
实体来逃避内部双引号,但您也可以使用临时xml片段。像这样:
xquery version "1.0-ml";
xdmp:document-insert("/test.xml", <root>
<pubTitle>'test'' pu'b'</pubTitle>
<firstPage>12</firstPage>
<lastPage>45</lastPage>
</root>)
;
xquery version "1.0-ml";
import module namespace search = "http://marklogic.com/appservices/search"
at "/MarkLogic/appservices/search/search.xqy";
let $searchText := <txt>'test'' pu'b'</txt>/concat('"', ., '"')
return
search:search(
"pubTitle:" || $searchText,
<options xmlns="http://marklogic.com/appservices/search">
<constraint name="pubTitle">
<value>
<element ns="" name="pubTitle"/>
</value>
</constraint>
</options>
)
我希望这能帮到你!