如何转义 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 中搜索 testpub,这是默认行为,我不会感到惊讶。

双引号也有点棘手,如果你想手动调用search:search。您需要用双引号将搜索值括起来,还需要用双引号来定义整个搜索字符串。你可以通过将它们加倍来转义内部双引号,将它们写成 &quot; 实体,但你也可以使用临时的 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>
  )

我希望这对你有用!