[MarkLogic Dev General] how to restrict a search:search query to only search within certain elements

Will Thompson wthompson at jonesmcclure.com
Mon Mar 19 15:32:35 PDT 2012


Jakob,

The setting "include document root" on the word query spec toggles whether everything is included or excluded by default. Set this to true if you want to define some exclusions and have the rest automatically included, and set it to false if you want the inverse. Also note that inclusions/exclusions propagate to descendants.

-Will

-----Original Message-----
From: general-bounces at developer.marklogic.com [mailto:general-bounces at developer.marklogic.com] On Behalf Of Jakob Fix
Sent: Saturday, March 17, 2012 2:29 PM
To: MarkLogic Developer Discussion
Subject: Re: [MarkLogic Dev General] how to restrict a search:search query to only search within certain elements

When including a number of elements via the Word Query specification
of the database, will this automatically *exclude* all elements *not*
mentioned, or do I have to exclude them one by one?  It doesn't seem
so as the elements <a:b>, <a:c>, <a:d> are included, but nevertheless
<a:e> also appears in the results. Thanks for confirmation.


On Sat, Mar 17, 2012 at 18:39, Colleen Whitney
<Colleen.Whitney at marklogic.com> wrote:
> Yes, you will, it just affects word query.
>
> Sent from my iPhone
>
> On Mar 17, 2012, at 10:12 AM, "Jakob Fix" <jakob.fix at gmail.com> wrote:
>
>> Thanks Colleen, once I knew the magic phrase that is "word query
>> specification" I also found an illustrative blog post by David
>> Cassell: http://blog.davidcassel.net/2011/10/word-query-specification/
>>
>> I hope that I'll still be able to create facets on other parts of the document.
>>
>> thanks!
>> Jakob.
>>
>>
>>
>> On Sat, Mar 17, 2012 at 16:04, Colleen Whitney
>> <Colleen.Whitney at marklogic.com> wrote:
>>> Jakob, if you want to restrict all unconstrained terms to a particular part of your content, you can configure a Word Query specification on you database. It's just like configuring a field, but controls how all word queries are evaluated.
>>>
>>> Sent from my iPhone
>>>
>>> On Mar 17, 2012, at 7:32 AM, "Jakob Fix" <jakob.fix at gmail.com> wrote:
>>>
>>>> I'd like to know whether the (working) solution below is the way to go
>>>> or whether there are better ways.
>>>>
>>>> Here it goes: I'd like to restrain a simple word search to a number of
>>>> elements, like so:
>>>>
>>>> cts:search(/*,
>>>> cts:and-query((
>>>>    cts:element-word-query(
>>>>      (xs:QName("abstract"),
>>>>      xs:QName("title"),
>>>>      xs:QName("subTitle")
>>>>      ),
>>>>      "query"
>>>>    )
>>>>  ))
>>>> )
>>>>
>>>> but I'd like to also use the search:search API in order to profit from
>>>> the snippeting, paging and reporting features it provides.
>>>>
>>>> I've looked at the <additional-query> option and indeed it works when
>>>> including the above cts:and-query, but I'm not sure whether that is
>>>> the optimal way of restraining search:search to a number of elements,
>>>> in particular the fact that I have to repeat the search term ($term)
>>>> seems kind of suboptimal:
>>>>
>>>> let $term := "cambodia"
>>>>
>>>> let $additional-query := cts:and-query((
>>>>    cts:element-word-query(
>>>>      (fn:QName("http://purl.org/dc/terms/", "abstract"),
>>>>      fn:QName("http://purl.org/dc/terms/", "title"),
>>>>      fn:QName("http://purl.org/dc/terms/", "subtitle")
>>>>      ),
>>>>      $term
>>>>    )
>>>>  ))
>>>>
>>>> let $options :=
>>>>  <options xmlns="http://marklogic.com/appservices/search">
>>>>    <additional-query>{$additional-query}</additional-query>
>>>>    <return-facets>false</return-facets>
>>>>     <debug>true</debug>
>>>>  </options>
>>>>
>>>> return search:search($term, $options)
>>>>
>>>>
>>>> I had looked also at using <element-query> constraints to constrain
>>>> the search to these elements only, but the <constraint> options seem
>>>> to provide a facility to further constrain the search via their name,
>>>> but I'm looking to only ever search in the three elements.
>>>>
>>>>    <constraint name="title">
>>>>      <element-query ns="http://purl.org/dc/terms/" name="title"/>
>>>>    </constraint>
>>>>    <constraint name="abstract">
>>>>      <element-query ns="http://purl.org/dc/terms/" name="abstract"/>
>>>>    </constraint>
>>>>    <constraint name="subtitle">
>>>>      <element-query ns="http://purl.org/dc/terms/" name="subtitle"/>
>>>>    </constraint>
>>>>
>>>> Defining these constraints would allow me to do
>>>> search:search("title:cambodia subtitle:cambodia abstract:cambodia",
>>>> $options) but my overall goal is to only search a number of predefined
>>>> elements for any search. And repeating the constraints and the terms
>>>> in the search seems clumsy.
>>>>
>>>> I didn't have more luck with the <word> constraint option, for the
>>>> same reason as the <element-query> option.
>>>>
>>>>  <constraint name="title">
>>>>    <word>
>>>>      <element ns="http://purl.org/dc/terms/" name="title"/>
>>>>    </word>
>>>>  </constraint>
>>>>  <constraint name="abstract">
>>>>    <word>
>>>>      <element ns="http://purl.org/dc/terms/" name="abstract"/>
>>>>    </word>
>>>>  </constraint>
>>>>
>>>> So is the <additional-query> approach the way to go?
>>>>
>>>> Thanks,
>>>> Jakob.
>>>> _______________________________________________
>>>> General mailing list
>>>> General at developer.marklogic.com
>>>> http://developer.marklogic.com/mailman/listinfo/general
>>> _______________________________________________
>>> General mailing list
>>> General at developer.marklogic.com
>>> http://developer.marklogic.com/mailman/listinfo/general
>> _______________________________________________
>> General mailing list
>> General at developer.marklogic.com
>> http://developer.marklogic.com/mailman/listinfo/general
> _______________________________________________
> General mailing list
> General at developer.marklogic.com
> http://developer.marklogic.com/mailman/listinfo/general
_______________________________________________
General mailing list
General at developer.marklogic.com
http://developer.marklogic.com/mailman/listinfo/general


More information about the General mailing list