Ravi
Ravi

Reputation: 1179

Restrict cts:search to set number of xml elements

I have a cts:query and I would like to restrict my cts:query to search only some xml elements . Is this possible without creating any field indexes or modifying my cts:query, as my cts:query is very big .. when I do this

cts:search((
        //es:raw/wos_dps:REC/wos_dps:static_data/wos_dps:summary/wos_dps:titles/wos_dps:title,
        //es:raw/wos_dps:REC/wos_dps:static_data/ wos_dps:fullrecord_metadata/ wos_dps:abstracts/ wos_dps:abstract
       )
      , 
      $q, 
      ('unfiltered'))[1 to 10]

where $q is my cts:query like below example. I get expression is unsearchable .. How to achieve this ?.. just to complete my code, following is my cts:query , below is just a sample, it much bigger cts:query :)

cts:and-query(
          (
           cts:or-query(
           (
             cts:near-query(
              (
                cts:or-query((
                    cts:word-query("Guideline", ("case-insensitive", "punctuation-insensitive", "whitespace-insensitive", "wildcarded")),
                    cts:word-query("guidelines", ("case-insensitive", "punctuation-insensitive", "whitespace-insensitive", "wildcarded"))
                   )
                  )
                ,
                cts:or-query((
                    cts:word-query("clinical", ("case-insensitive", "punctuation-insensitive", "whitespace-insensitive", "wildcarded")),
                    cts:word-query("practice", ("case-insensitive", "punctuation-insensitive", "whitespace-insensitive", "wildcarded")),
                    cts:word-query("adherence", ("case-insensitive", "punctuation-insensitive", "whitespace-insensitive", "wildcarded"))         
                   )
                  )
              )
             , 
             4,
             ('unordered'))
             ,
               cts:near-query((
                cts:word-query("phase", ("case-insensitive", "wildcarded")),
                cts:or-query((
                  cts:word-query("0", ("case-insensitive", "wildcarded")),
                  cts:word-query("1", ("case-insensitive", "wildcarded")),
                  cts:word-query("2", ("case-insensitive", "wildcarded")),
                  cts:word-query("3", ("case-insensitive", "wildcarded")),
                  cts:word-query("4", ("case-insensitive", "wildcarded")),
                  cts:word-query("i", ("case-insensitive", "wildcarded")),
                  cts:word-query("ii", ("case-insensitive", "wildcarded")),
                  cts:word-query("iii", ("case-insensitive", "wildcarded")),
                  cts:word-query("iv", ("case-insensitive", "wildcarded"))
                )))
               , 
               0, 
               ('unordered')),
             cts:near-query((
               cts:or-query((
                 cts:word-query("phase2*", ("case-insensitive", "wildcarded")),
                 cts:word-query("phase1*", ("case-insensitive", "wildcarded")),
                 cts:word-query("phase0*", ("case-insensitive", "wildcarded")),
                 cts:word-query("phase4*", ("case-insensitive", "wildcarded")),
                 cts:word-query("phase3*", ("case-insensitive", "wildcarded")),
                 cts:word-query("phasei*", ("case-insensitive", "wildcarded")),
                 cts:word-query("phaseii*", ("case-insensitive", "wildcarded")),
                 cts:word-query("phaseiii*", ("case-insensitive", "wildcarded")),
                 cts:word-query("phaseiv*", ("case-insensitive", "wildcarded"))
               )),
               cts:or-query((
                cts:word-query("trail*", ("case-insensitive", "wildcarded")),
                cts:word-query("study", ("case-insensitive", "wildcarded")),
                cts:word-query("studies*", ("case-insensitive", "wildcarded"))
               ))
               ), 
               1, 
               ('unordered')),
           )
          ),
           cts:collection-query(("http://xxxx/entity/wos/article")),
           cts:element-attribute-value-query((xs:QName(xs:QName("wos_dps:pub_info"))),
                  (xs:QName("wos_dps:pubyear")),
                  "2017")
          )
          , 
          ("unordered"))

Upvotes: 0

Views: 53

Answers (1)

Rob S.
Rob S.

Reputation: 3609

To answer your core question, you can use cts:element-query to restrict a query to a specific element.

Your query has a lot of room for optimization. I don't expect it would scale against large data sets. I highly recommend you have any MarkLogic resources you are in contact with take a look what you're trying to do and evaluate your approach.

Upvotes: 4

Related Questions