MarkLogic - Запрос нескольких входных значений с использованием API поиска. - PullRequest
0 голосов
/ 28 октября 2018

MarkLogic версия 9.0-6.2

Мне нужно принять входные данные (скажем, PolicyId) в массиве и вернуть все документы в коллекции, соответствующие списку PolicyIds.Индекс диапазона элементов создается на PolicyId, и я могу сделать это с помощью запроса ниже.Код работает, как и ожидалось.

const PolList = ["pol1","pol2","pol3"]
cts.search(
   cts.jsonPropertyRangeQuery("RegistrationId", "=",PolList)
)

Теперь я пытаюсь сделать то же самое с API поиска (search.search).Я создал файл опций и развернул его в базе данных модулей

{
"options": 
  {
  "search-option": "unfiltered",
  "additional-query":[
              "<collection-query xmlns='http://marklogic.com/cts'>
              <uri>registration</uri>
              </collection-query>"
              ],
  "constraint": [
              { 
                "name": "policyId",
                "range": {
                "type": "xs:string",
                "collation" : "http://marklogic.com/collation/codepoint",
                "element": {"name": "PolicyId" }
                 }
              }
         ],
"extract-document-data": 
              {
              "selected": "all"
              }
  }
}

Затем я использую приведенный ниже код для извлечения документов.

const SearchOptions = fn.head(xdmp.invokeFunction(
     function() {
           return fn.doc("/Default/data-hub-FINAL/rest- 
 api/options/PolicyId.xml");
   },
   {
    'database': xdmp.database('data-hub-MODULES')
    }));

const result = fn.head(search.search('PolicyId:'+PolicyId, 
SearchOptions.firstChild)).xpath('search:result/search:extracted/data()', 
{'search': 'http://marklogic.com/appservices/search'});

Этот код работает нормально для одного PolicyId.Как я могу передать массив PolicyIds и заставить его работать?Я хочу получить все документы одним вызовом базы данных.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Я могу решить эту проблему с помощью оператора ИЛИ, как показано ниже.

const result = fn.head(search.search('PolicyId:'+PolicyId1 +' OR ' +PolicyId2, 
SearchOptions.firstChild)).xpath('search:result/search:extracted/data()', 
{'search': 'http://marklogic.com/appservices/search'});

Я не точно передаю список, но объединяю список входных PolicyIds с оператором ИЛИ и могу получить всесоответствующие документы назад.

0 голосов
/ 30 октября 2018

Вместо использования API поиска рассмотрите возможность использования cts.parse (), который может привязывать несколько значений к тегу, как в PolicyId:(pol1, pol2, pol3)

Для получения дополнительной информации см. Пример cts.parse () сcolor:(red blue) in:

http://docs.marklogic.com/guide/search-dev/cts_query#id_86861

Кроме того, JSearch предоставляет вспомогательные функции для поиска в SJS (JavaScript на стороне сервера).Для получения дополнительной информации см .:

http://docs.marklogic.com/guide/search-dev/javascript

...