Я работаю над поисковым веб-приложением с использованием MarkLogic 9. У меня есть интерфейс построения запросов, который позволяет пользователям вводить строки в текстовые поля, соответствующие определенным свойствам JSON документов в базе данных. Идея заключалась в том, что пользователь мог вводить условия поиска точно так, как их ожидает cts.parse (я использую javascript на стороне сервера, а не XQuery), чтобы их поиск мог быть сколь угодно сложным, и мне не пришлось бы заниматься синтаксическим анализом запросов самостоятельно. . Однако после некоторого тестирования я обнаружил странный феномен, связанный с использованием круглых скобок в булевой логике. А именно, когда вы включаете круглые скобки в такие утверждения, как кошка и (собака ИЛИ птица), cts.parse ошибочно принимает ИЛИ за поисковый запрос.
Приведу реальный пример со своего сайта:
Я создал объект привязки для привязки запросов к элементам моих документов,
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)
Вот несколько примеров введенных строк и возвращенных запросов:
- мозг ИЛИ сердце ИЛИ легкое
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)], [])
Этот правильно генерирует jsonPropertyWordQuery для 3 полей (заголовок, аннотация, термины сетки) для термина «мозг», но не может этого сделать для двух других терминов, для которых он просто генерирует 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"])], [])
- мозг ИЛИ (сердце И легкие)
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, но другие термины добавляются как базовые запросы слов, которых я стараюсь избегать.
- (мозг ИЛИ сердце) И легкое
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 или объект привязки?
Любая помощь будет принята с благодарностью.