gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:54:39 26 4
gpt4 key购买 nike

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

我将提供一个来 self 的网站的实际示例:

我已经构建了一个绑定(bind)对象来将查询绑定(bind)到我的文档的元素,

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),
])
);
},
}

我的服务器端脚本调用,例如,

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)], [])

这个正确地为“大脑”术语的 3 个字段(标题、摘要、网格术语)生成 jsonPropertyWordQuery,但对于其他两个术语没有这样做,它只是生成一个 cts.wordQuery() .

  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 还是 bindings 对象?

任何帮助将不胜感激。

最佳答案

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

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

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

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

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

或者:给定传递给函数的一组值,将它们用空格连接起来,并将其传递给对 cts:parse 的单独调用,以将它们解释为可以包装的查询。

关于javascript - MarkLogic 9 cts.parse 未正确解析查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45290310/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com