MarkLogic search API 是否支持 cts:or-query 的逗号
Does MarkLogic search API support comma for cts:or-query
我正在使用 Marklogic8,我们的查询如下:
query=Color:red,yellow,black AND Size:middle
搜索选项如下:
<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
但是太长了。
有没有可能缩短我们的输入查询?
markLogic 搜索 API 不会这样做。但是,您可以在搜索 API 上编写一个小的自定义搜索约束来完成您想要做的事情。 Custom constraints传递了2个参数——分号左右两边的信息。然后,您可以根据需要创建适当的查询以进行匹配。您也可以通过扩展搜索库来实现这一点。
但是,在将查询传递给服务器之前,您也可以在逻辑中处理这件事。
可能值得研究 cts:parse。您必须自己将选项转换为绑定(不太困难),但您会得到一个稍微更高级、更快的搜索字符串解析器。它允许其他表达式,如:
Color = (yellow red black) AND Size:middle
另请参阅:http://docs.marklogic.com/guide/search-dev/cts_query#id_15151
HTH!
我正在使用 Marklogic8,我们的查询如下:
query=Color:red,yellow,black AND Size:middle
搜索选项如下:
<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
但是太长了。
有没有可能缩短我们的输入查询?
markLogic 搜索 API 不会这样做。但是,您可以在搜索 API 上编写一个小的自定义搜索约束来完成您想要做的事情。 Custom constraints传递了2个参数——分号左右两边的信息。然后,您可以根据需要创建适当的查询以进行匹配。您也可以通过扩展搜索库来实现这一点。
但是,在将查询传递给服务器之前,您也可以在逻辑中处理这件事。
可能值得研究 cts:parse。您必须自己将选项转换为绑定(不太困难),但您会得到一个稍微更高级、更快的搜索字符串解析器。它允许其他表达式,如:
Color = (yellow red black) AND Size:middle
另请参阅:http://docs.marklogic.com/guide/search-dev/cts_query#id_15151
HTH!