Il problema con un vincolo di proprietà è, che cambia solo la portata frammento, e non accetta un attributo name per limitare la ricerca a un solo immobile. Se aggiungi <return-query>true</return-query>
vedresti quale sarebbe la query risultante.
Ci sono alcune opzioni anche se ..
prima opzione è quella di utilizzare <fragment-scope>properties</fragment-scope>
. È possibile utilizzarlo al livello più alto per applicarlo a tutti i vincoli di ricerca e anche per vincolo solo per influenzare determinati vincoli. È un modo relativamente semplice per imporre le query di ricerca per l'esecuzione su frammenti di proprietà, anziché su frammenti di documenti. Il rovescio della medaglia è che non influenzerà le corrispondenze di ricerca, anche frammenti.
Per influenzare i frammenti, è meglio fare ciò che suggerisce @mblakele e utilizzare l'espressione ricercabile: <searchable-expression>xdmp:document-properties()</searchable-expression>
. Ciò influenzerà in realtà sia gli snippet che le query di ricerca, quindi l'utilizzo di tale funzione ti consentirà di ottenere snippet di ricerca e di eseguire query su frammenti di proprietà. Il vincolo dell'autore non limita comunque la proprietà del tuo autore.
Una volta eseguita la ricerca su frammenti di proprietà, limitare la ricerca a una particolare proprietà è in realtà piuttosto semplice. È solo un elemento come tutti gli altri. Usa un vincolo di parola, valore o intervallo per farlo funzionare.
Di seguito il codice per illustrare quanto sopra:
xquery version "1.0-ml";
import module namespace search = "http://marklogic.com/appservices/search"
at "/MarkLogic/appservices/search/search.xqy";
(: original approach :)
let $options1 :=
<options xmlns="http://marklogic.com/appservices/search">
<constraint name="author">
<properties name="prop:Author"/>
</constraint>
<return-query>true</return-query>
</options>
let $results1 := search:search("author:Administrator", $options1, 1, 1)
(: using fragment-scope :)
let $options2 :=
<options xmlns="http://marklogic.com/appservices/search">
<fragment-scope>properties</fragment-scope>
<constraint name="author">
<properties name="prop:Author"/>
</constraint>
<return-query>true</return-query>
</options>
let $results2 := search:search("author:Administrator", $options2, 1, 1)
(: using searchable-expression :)
let $options3 :=
<options xmlns="http://marklogic.com/appservices/search">
<searchable-expression>xdmp:document-properties()</searchable-expression>
<constraint name="author">
<properties name="prop:Author"/>
</constraint>
<return-query>true</return-query>
</options>
let $results3 := search:search("author:Administrator", $options3, 1, 1)
(: using searchable-expression with an element word constraint :)
let $options4 :=
<options xmlns="http://marklogic.com/appservices/search">
<searchable-expression>xdmp:document-properties()</searchable-expression>
<constraint name="author">
<word>
<element name="Author" ns="http://marklogic.com/xdmp/property"/>
</word>
</constraint>
<return-query>true</return-query>
</options>
let $results4 := search:search("author:Administrator", $options4, 1, 1)
return (
$results1,
$results2,
$results3,
$results4
)
Il quarto esempio dovrebbe dare i risultati che stavi cercando.
HTH!