2017-06-14 31 views
2

我想用MarkLogic 9使用服務器端Javascript實現一個簡單的羣集應用程序。我有一個已經在JS中實現的非常複雜的自定義查詢生成器,所以我寧願在.sjs文件中執行它。MarkLogic 9羣集 - 使用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

你有沒有考慮在你的js-eval中返回someQueryVariable,並在xqy中運行cts:search? – grtjn

回答

2

如果我理解正確,你想實現在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例子,是這樣的你是什麼後?

相關問題