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

Jakob Fix jakob.fix at gmail.com
Sat Mar 17 14:29:23 PDT 2012


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


More information about the General mailing list