如何转义 search:search 中的单引号?
How to escape single quote in search:search?
我正在使用 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
第一个参数)
求助!
此更新有助于解决问题。您对单引号感到满意。
更准确地说,您想要搜索包含单引号、空格甚至标点符号的标题。进行值搜索是有意义的,但是您传入 search:search
的搜索字符串会被解析。如果您不将搜索值或短语括在引号中,解析器将认为该值在下一个空格处结束。如果您不更改 <quotation>
选项,解析器将在 ''test
之后停止(在您给出的初始示例中)。
将 <quotation>
更改为单引号会使事情变得更糟,因为您的搜索值也包含单引号,解析器会混淆它们。如果 search:search
最终在 full-text 中搜索 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>
)
我希望这对你有用!
我正在使用 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
第一个参数)
求助!
此更新有助于解决问题。您对单引号感到满意。
更准确地说,您想要搜索包含单引号、空格甚至标点符号的标题。进行值搜索是有意义的,但是您传入 search:search
的搜索字符串会被解析。如果您不将搜索值或短语括在引号中,解析器将认为该值在下一个空格处结束。如果您不更改 <quotation>
选项,解析器将在 ''test
之后停止(在您给出的初始示例中)。
将 <quotation>
更改为单引号会使事情变得更糟,因为您的搜索值也包含单引号,解析器会混淆它们。如果 search:search
最终在 full-text 中搜索 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>
)
我希望这对你有用!