Применение ограничений источника предложения для typeahead в Marklogic

Скажем, у меня есть 5 документов, которые принадлежат любой из разных коллекций, например:

Biography, Fiction, Humour, Adventure 

Например, документ 1 находится в коллекции Приключения:

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

документ 2 находится в сборнике Биография:

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

Теперь я хочу применить предложение к элементу year. Я хочу применить это к коллекциям, то есть, например, предложить к коллекциям биографий. Я определил индекс диапазона элементов для year и загрузил образцы документов с помощью загрузчика приложений и настроил коллекции для документов в настройках документа.

Follwing - это мой код XQUERY:

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)  

При выполнении этого запроса я получаю предложения для 2011 и 2007, чего я не ожидал. Ожидаемое предложение - 2011 (поскольку нужно искать только коллекцию Biography). Я сослался на этот документ при поиске: предложить, но я не могу узнать, что именно это ошибка. Где я делаю не так?


person Shrey Shivam    schedule 18.10.2013    source источник


Ответы (2)


Шрей:

Значения из источника предложения заменяются значениями из указанного ограничения. Другими словами, параметры говорят, что входные данные, квалифицированные ограничением группы, должны поступать из индекса диапазона лет, что вы и видите. Для более подробной информации, пожалуйста, смотрите:

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

Чтобы отфильтровать набор предложений, вы можете вызвать search: offer () с двумя строковыми запросами. Первый предоставляет исходные данные для предложений. Второй обеспечивает ограничение фильтрации. В приведенном выше случае ограничением фильтрации будет коллекция Biography. Для более подробной информации, пожалуйста, смотрите:

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

Надеюсь, что это поможет

person ehennum    schedule 18.10.2013
comment
Биография - это название коллекции, к которой принадлежит документ. Добавление еще одного запроса в качестве search: offer ((Группа: 20, Биография), $ options) возвращает пустую последовательность. Моя проблема в том, что я хочу получать предложения по документам из определенной коллекции по определенному элементу диапазона. Здесь биография - это коллекция, а год - это элемент. Я просмотрел ссылки, но не смог правильно понять, не могли бы вы разработать правильный xquery для этого - person Shrey Shivam; 21.10.2013

Однако я могу добиться требуемого результата, используя additional-query в следующих параметрах:

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)

Тем не менее, мне было интересно, как это можно сделать без использования параметра дополнительного запроса, потому что было бы более оптимизировано использование ограничения коллекции для указанного выше.

person Shrey Shivam    schedule 21.10.2013