MarkLogic 9 cts.parse 未正确解析查询

MarkLogic 9 cts.parse not parsing queries correctly

我正在使用 MarkLogic 9 开发 web-based 搜索应用程序。我有一个查询构建界面,允许用户将字符串输入文本框,这些文本框对应于文档的特定 JSON 属性D b。这个想法是用户可以完全按照 cts.parse(我使用服务器端 javascript,而不是 XQuery)期望的那样输入搜索词,这样他们的搜索就可以任意复杂,而我不必自己处理解析查询。然而,在做了一些测试之后,我发现了一个关于在布尔逻辑中使用括号的奇怪现象。即,当您在诸如 cat and (dog OR bird) 的语句中包含括号时,cts.parse 会将 OR 误认为是搜索词。

我将提供我网站上的实际示例:

我构建了一个绑定 object 来将查询绑定到我的文档的元素,

var qOpts = ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded"];


var bindings = {
 main: function(operator, values, options){
  return(
    cts.orQuery([
     cts.jsonPropertyWordQuery('title',values,qOpts),
     cts.jsonPropertyWordQuery('abstract',values,qOpts),
     cts.jsonPropertyWordQuery('meshterms',values,qOpts),
     ])
  );
 }, 
}

我的 server-side 脚本调用,例如

cts.parse('main:'+params.mainQuery,bind)

以下是输入的字符串和返回的查询的一些示例:

  1. 大脑或心脏或肺部

cts.orQuery([cts.jsonPropertyWordQuery("title", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.jsonPropertyWordQuery("abstract", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.jsonPropertyWordQuery("meshterms", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.wordQuery("heart", ["lang=en"], 1), cts.wordQuery("lung", ["lang=en"], 1)], [])

这个为 "brain" 术语的 3 个字段(标题、摘要、网格术语)正确生成了 jsonPropertyWordQuery,但没有为其他两个术语生成一个 [= =94=]().

  1. 大脑或心脏和肺部

cts.orQuery([cts.jsonPropertyWordQuery("title", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.jsonPropertyWordQuery("abstract", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.jsonPropertyWordQuery("meshterms", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.andQuery([cts.wordQuery("heart", ["lang=en"], 1), cts.wordQuery("lung", ["lang=en"], 1)], ["unordered"])], [])

  1. 大脑或(心脏和肺)

cts.orQuery([cts.jsonPropertyWordQuery("title", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.jsonPropertyWordQuery("abstract", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.jsonPropertyWordQuery("meshterms", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.andQuery([cts.wordQuery("heart", ["lang=en"], 1), cts.wordQuery("lung", ["lang=en"], 1)], ["unordered"])], [])

2 和 3 看起来是一样的。第一部分正确生成一个 jsonPropertyWordQuery,但其他术语作为基本单词查询被添加,我试图避免这种情况。

  1. (大脑或​​心脏)和肺

cts.andQuery([cts.orQuery([cts.jsonPropertyWordQuery("title", ["brain", "OR", "heart"], ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.jsonPropertyWordQuery("abstract", ["brain", "OR", "heart"], ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.jsonPropertyWordQuery("meshterms", ["brain", "OR", "heart"], ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1)], []), cts.wordQuery("lung", ["lang=en"], 1)

在这里,解析器似乎没有识别出 OR 是一个运算符,因为即使它正确地生成了 jsonPropertyWordQueries,它也将 OR 作为一个术语包含在搜索中。

老实说,我找不到任何正确的查询,这让我相信我一定做错了什么。我不知道那可能在哪里。我是在滥用 cts.parse 还是滥用绑定 object?

如有任何帮助,我们将不胜感激。

我不清楚你的确切查询字符串是什么。

如果查询字符串类似于 "main:(cat OR dog)",则 OR 不是该上下文中的关键字。标记后允许的内容非常有限,并且不是查询语言的全部范围,它只是文字列表。

如果查询字符串类似于 "main:cat OR dog,那么标签的范围就是 cat

希望标签后的 () 作用于整个查询的范围并非不合理,现在您可以将函数绑定到标签(当它被固定到范围索引或字段时没有任何意义),但是语法不是这样设置的。

所以你只需要零碎地做事:main:cat OR main:dog

或者:给定传递给您的函数的值集,space-连接它们并将其传递给对 cts:parse 的单独调用,以将它们解释为您可以包装的查询。

正如 Mary 所解释的,您应该将 main:cat OR dog 读作 (main:cat) OR dog。您可以像 Erik 建议的那样做一些事情,并在解析为 main:cat OR main:dog 之前重写查询,或者您可以解析 cat OR dog(不带前缀),然后 post-处理 cts:query 树来扩展 cts:word-query's 与你所追求的 3-some or-query's 的出现。使用 typeswitch 的递归函数应该可以解决这个问题。

HTH!