質問

Say, I have 5 documents that belong to either of different collections such as:

Biography, Fiction, Humour, Adventure 

For instance, document 1 is in Adventure Collection:

<Book>
<title>Harry Potter and the Deathly Hallows</title>
<Author>J.K.Rowling</Author>
<year>2007</year>
</Book>

document 2, is in Biography Collection:

<Book>
<title>Steve Jobs</title>
<Author>Walter Issacson</Author>
<year>2011</year>
</Book>

Now I want to apply suggest on year element. I want to apply this on collections i.e. for example-suggest on Biography collections I have defined element range index on year and ingested sample documents using application loader and configured collections for documents in document settings.

Follwing is my XQUERY code:

xquery version "1.0-ml";
import module namespace search = "http://marklogic.com/appservices/search"
    at "/MarkLogic/appservices/search/search.xqy";

let $options := 
<options xmlns="http://marklogic.com/appservices/search">
 <constraint name="Group">
    <collection prefix="Biography/"/>
 </constraint>

 <suggestion-source ref="Group">
   <range collation="http://marklogic.com/collation/" 
          type="xs:string" >
      <element name="year"/>
   </range>
 </suggestion-source>
 </options>
return    
search:suggest("Group:20", $options)  

On running this query I am getting suggestions for both 2011 and 2007 which is not what I am expecting. Expected suggestion is 2011 (as only Biography collection should be searched). I have refered this doc on search:suggest but I am not able to find out what exactly is the mistake. Where am I doing wrong?

役に立ちましたか?

解決 2

However, I am able to achieve the required output using additional-query in options as follows:

xquery version "1.0-ml";
import module namespace search = "http://marklogic.com/appservices/search"
at "/MarkLogic/appservices/search/search.xqy"; 
let $options := 
    <options xmlns="http://marklogic.com/appservices/search">
        <additional-query>{cts:collection-query("Biography")}
        </additional-query>
        <constraint name="Search_Element">
          <range collation="http://marklogic.com/collation/" 
           type="xs:string" >
            <element name="year"/>
          </range>
        </constraint> 
        <suggestion-source ref="Search_Element">
          <range collation="http://marklogic.com/collation/" 
          type="xs:string" >
          <element name="year"/>
          </range>
        </suggestion-source>
    </options>
return    
search:suggest("Search_Element:20", $options)

Still, I was wondering how could it be done without using additional-query paramater because it would be more optimized to use collection constraint for above.

他のヒント

Shrey:

The values from the suggestion source are substituted for the values from the referenced constraint. In other words, the options say that input qualified by the group constraint should come from the year range index, which is what you're seeing. For more detail, please see:

http://docs.marklogic.com/guide/search-dev/search-api#id_40748

To filter a set of suggestions, you can call search:suggest() with two string queries. The first provides the input for the suggestions. The second provides the filtering constraint. In the case above, the filtering constraint would be the Biography collection. For more detail, please see:

http://docs.marklogic.com/guide/search-dev/search-api#id_91911

Hoping that helps

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top