Ale*_*ing 2 javascript marklogic marklogic-9
我正在使用MarkLogic 9开发基于Web的搜索应用程序.我有一个查询构建接口,允许用户将字符串输入到与db中文档的特定JSON属性相对应的文本框中.这个想法是用户可以输入搜索条件,就像cts.parse(我使用服务器端javascript,而不是XQuery)所期望的那样,因此他们的搜索可能是任意复杂的,我不必处理自己解析查询.然而,经过一些测试,我发现了一个关于在布尔逻辑中使用括号的奇怪现象.也就是说,当你在括号中添加像cat和(dog OR bird)这样的语句时,cts.parse会将OR误认为是搜索词.
我将从我的网站提供一个实际的例子:
我构造了一个绑定对象来将查询绑定到我的文档的元素,
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),
])
);
},
}Run Code Online (Sandbox Code Playgroud)
我的服务器端脚本调用,例如,
cts.parse('main:'+params.mainQuery,bind)Run Code Online (Sandbox Code Playgroud)
以下是输入的字符串和返回的查询的一些示例:
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)], [])Run Code Online (Sandbox Code Playgroud)
这个适当地为"大脑"术语的3个字段(标题,摘要,网格术语)生成jsonPropertyWordQuery,但是对于其他两个术语不能这样做,它只是生成一个cts.wordQuery().
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"])], [])Run Code Online (Sandbox Code Playgroud)
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"])], [])Run Code Online (Sandbox Code Playgroud)
2和3看起来是一样的.第一部分正确生成jsonPropertyWordQuery,但其他术语作为基本单词查询,我试图避免.
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)Run Code Online (Sandbox Code Playgroud)
这里,解析器似乎没有认识到OR是一个运算符,因为即使它正确生成了jsonPropertyWordQueries,它也会在搜索中包含OR作为一个术语.
老实说,我无法找到任何正确的查询,这让我相信我一定做错了.我不知道那可能是哪里.我是否滥用cts.parse或绑定对象?
任何帮助将不胜感激.
小智 7
我不清楚你确切的查询字符串是什么.
如果查询字符串类似于"main:(cat OR dog)"那么OR不是该上下文中的关键字.标签之后允许的内容非常有限,并且不是查询语言的全部范围,它只是一个文字列表.
如果查询字符串类似于"main:cat OR dog那么标记的范围就是cat.
现在你可以将一个函数绑定到一个标签(当它被固定到一个范围索引或字段时没有任何意义),那么希望标签后面的()对整个查询进行范围化是不合理的,但这不是怎么回事语法设置.
所以你只需要零碎地做事: main:cat OR main:dog
或者:给定传递给函数的值集合,空间连接它们并将其传递给单独的调用,cts:parse以将它们解释为可以包装的查询.
| 归档时间: |
|
| 查看次数: |
88 次 |
| 最近记录: |