如何在搜索中逃避单引号:搜索?

时间:2017-03-09 11:15:36

标签: marklogic marklogic-7

我正在使用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第一个参数)

帮助!

1 个答案:

答案 0 :(得分: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>
  )

我希望这能帮到你!