1

我正在使用search:searchAPI。

在中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>

现在我想'test''pu'b'在 pubTitle 元素中搜索带有文本的文档。

我的搜索查询是什么?(search:search第一个参数)

帮助!

4

1 回答 1

1

该更新有助于解决问题。你有单引号的内容。

更准确地说,您想要搜索包含单引号、空格甚至可能是插符号的标题。进行值搜索是有意义的,但是您传入的搜索字符串search:search会被解析。如果您不将搜索值或短语用引号括起来,解析器将认为该值在下一个空格处结束。如果您不更改<quotation>选项,解析器将在之后停止''test(在您给出的初始示例中)。

更改<quotation>为单引号会使事情变得更糟,因为您的搜索值也包含单引号,解析器会混淆它们。search:search如果最终搜索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>
  )

我希望这对你有用!

于 2017-03-16T19:21:29.873 回答