MarkLogic 9 Clusters - ограничение определенных полей с помощью SJS
Я пытаюсь реализовать простое приложение кластеризации с MarkLogic 9, используя Javascript на стороне сервера. У меня есть довольно сложный пользовательский конструктор запросов, который уже реализован в JS, поэтому я бы предпочел сделать все это в файле.sjs.
Моя проблема в том, что я не могу понять, как ограничить кластеризованный поиск, чтобы посмотреть только на несколько свойств документа (а именно, "заголовок" и "абстрактный"). Ни у одного из свойств нет детей. Я попробовал следовать демонстрации пьес Шекспира, но она реализована в XQuery.
Моя текущая реализация - это файл.xqy, который использует xdmp:javascript-eval для использования моего компоновщика запросов js. Это работает и успешно возвращает результаты запроса, используя:
$qry-results := xdmp:javascript-eval(cts.search(someQueryVariable).toArray())
Я предполагаю, что проблема в моем коде XQuery, который я как бы скопировал из примера Шекспира, но я занимался этим много часов и не могу заставить его работать. Вот мой XQuery в его нынешнем виде:
declare namespace db="http://marklogic.com/xdmp/database" ;
declare namespace cl="cts:cluster" ;
declare namespace dt="cts:distinctive-terms" ;
let $options-node :=
<options xmlns="cts:cluster" >
<overlapping>false</overlapping>
<label-max-terms>1</label-max-terms>
<label-ignore-words>a of the when s as</label-ignore-words>
<max-clusters>10</max-clusters>
<!-- turn all database-level indexing options OFF - only use field terms -->
<db:word-searches>false</db:word-searches>
<db:stemmed-searches>false</db:stemmed-searches>
<db:fast-case-sensitive-searches>false</db:fast-case-sensitive-searches>
<db:fast-diacritic-sensitive-searches>false</db:fast-diacritic-sensitive-searches>
<db:fast-phrase-searches>false</db:fast-phrase-searches>
<db:phrase-throughs/>
<db:phrase-arounds/>
<db:fast-element-word-searches>false</db:fast-element-word-searches>
<db:fast-element-phrase-searches>false</db:fast-element-phrase-searches>
<db:element-word-query-throughs/>
<db:fast-element-character-searches>false</db:fast-element-character-searches>
<db:range-element-indexes/>
<db:range-element-attribute-indexes/>
<db:one-character-searches>false</db:one-character-searches>
<db:two-character-searches>false</db:two-character-searches>
<db:three-character-searches>false</db:three-character-searches>
<db:trailing-wildcard-searches>false</db:trailing-wildcard-searches>
<db:fast-element-trailing-wildcard-searches>false</db:fast-element-trailing-wildcard-searches>
<db:fields>
<field>
<field-name>abstract</field-name>
<include-root>true</include-root>
<stemmed-searches>advanced</stemmed-searches>
<db:fast-phrase-searches>true</db:fast-phrase-searches>
</field>
<field>
<field-name>title</field-name>
<include-root>true</include-root>
<stemmed-searches>advanced</stemmed-searches>
<db:fast-phrase-searches>true</db:fast-phrase-searches>
</field>
<field>
<field-name>institution</field-name>
<include-root>false</include-root>
<stemmed-searches>advanced</stemmed-searches>
<db:fast-phrase-searches>false</db:fast-phrase-searches>
</field>
<field>
<field-name>researcher</field-name>
<include-root>false</include-root>
<stemmed-searches>advanced</stemmed-searches>
<db:fast-phrase-searches>false</db:fast-phrase-searches>
</field>
</db:fields>
</options>
let $res := cts:cluster( $qry-results, $options-node )/cts:cluster
return $res
И ошибка, которую я получаю чаще всего, выглядит примерно так:
XDMP-ARGTYPE: (err:XPTY0004) cts:cluster(json:array(<json:array xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" .../>...XDMP-CHILDNODEKIND: element nodes cannot have object node children...), <options xmlns="cts:cluster"><overlapping>false</overlapping><label-max-terms>...</label-max-terms>...</options>) -- arg1 is not of type node()*
in /cluster.xqy, at 113:12 [1.0-ml]
$qry-results = json:array(<json:array xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" .../>...XDMP-CHILDNODEKIND: element nodes cannot have object node children...)
$options-node = <options xmlns="cts:cluster"><overlapping>false</overlapping><label-max-terms>...</label-max-terms>...</options>
Я уверен, что это что-то глупое, но у меня нет опыта работы с XQuery, поэтому я не могу понять это, и сейчас я просто бьюсь головой об стену.
1 ответ
Если я правильно понимаю, вы хотите реализовать поиск в SJS, так что вы можете просто построить свой поиск следующим образом:
cts.cluster(
cts.search(cts.wordQuery('some terms')).toArray(),
{
overlapping: false,
labelIgnoreWords: ['a', 'of', 'the', 'when', 's', 'as'],
stemmedSearches: false,
fastPhraseSearches: false,
fastElementWordSearches: false,
fastElementPhraseSearches: false,
//add your other options here
}
);
это теперь чистый пример JavaScript, это было то, что вы были после?