MarkLogic是否为cts:or-query搜索API支持逗号

时间:2018-01-19 08:18:45

标签: xquery marklogic marklogic-8

我使用的是Marklogic8,我们的查询如下:

<options xmlns="http://marklogic.com/appservices/search"> <grammar> <quotation>"</quotation> <implicit> <cts:and-query strength="20" xmlns:cts="http://marklogic.com/cts"/> </implicit> <starter strength="30" apply="grouping" delimiter=")">(</starter> <starter strength="40" apply="prefix" element="cts:not-query" tokenize="word">NOT</starter> <joiner strength="10" apply="infix" element="cts:or-query" tokenize="word">OR</joiner> <joiner strength="20" apply="infix" element="cts:and-query" tokenize="word">AND</joiner> <joiner strength="10" apply="infix" element="cts:or-query">,</joiner> <joiner strength="50" apply="constraint">:</joiner> </grammar> <constraint name="Color"><value><element name="Color" ns="" /></value></constraint> <constraint name="Size"><value><element name="Size" ns="" /></value></constraint> </options>

搜索选项如下:

cts:query(search:parse($query, $options)

我们正在使用它来解析我们的查询文本:

<cts:or-query xmlns:cts="http://marklogic.com/cts">
  <cts:element-value-query>
    <cts:element>Color</cts:element>
    <cts:text xml:lang="en">red</cts:text>
  </cts:element-value-query>
  <cts:word-query>
    <cts:text xml:lang="en">yellow</cts:text>
  </cts:word-query>
  <cts:word-query>
    <cts:text xml:lang="en">black</cts:text>
  </cts:word-query>
  <cts:element-value-query>
    <cts:element>Size</cts:element>
    <cts:text xml:lang="en">middle</cts:text>
  </cts:element-value-query>
</cts:or-query>

但是,它无法解析查询以纠正方式:

query=Color:red OR Color:yellow OR Color:black AND Size:middle

我知道我们可以使用如下的输入查询:

public func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) { print("[ERROR] Could not connect to peripheral \(peripheral.identifier.uuidString) error: \(error!.localizedDescription)") }

但它太长了。

有没有可能缩短我们的输入查询?

2 个答案:

答案 0 :(得分:3)

markLogic Search API不会这样做。但是,您可以在搜索API上编写一个小的自定义搜索约束来完成您要执行的操作。 Custom constraints传递2个参数 - 分号左侧和右侧的信息。然后,您可以根据需要创建匹配的正确查询。您也可以通过扩展搜索库来实现这一目标。

但是,在将查询传递给服务器之前,您还可以在逻辑中处理这些问题。

答案 1 :(得分:0)

可能值得研究cts:parse。您必须自己将选项转换为绑定(不是太困难),但是您将为搜索字符串获得更高级,更快速的解析器。它允许以下表达式:

Color = (yellow red black) AND Size:middle

另请参阅:http://docs.marklogic.com/guide/search-dev/cts_query#id_15151

HTH!