Поиск грамматики для получения документа, который не имеет поля в них в Marklogic - PullRequest
1 голос
/ 26 апреля 2019

У меня есть поле в моей базе данных, и у него есть индекс диапазона полей типа xs:string, и у меня включены word searches, trailing wildcard searches и field value searches.

Ниже приведен примерпараметры

  <options xmlns="http://marklogic.com/appservices/search">
 <constraint name="pmid">
          <range type="xs:string" facet="false">
            <field name="wos_pmid"/>
        </range>
    </constraint>
    <term>
        <term-option>case-insensitive</term-option>
        <term-option>punctuation-insensitive</term-option>
        <term-option>whitespace-insensitive</term-option>
        <term-option>wildcarded</term-option>
    </term>
    <transform-results apply="empty-snippet"/>
</options>

, когда я делаю (pmid:*), я не получаю результатов, но он должен был показать мне все записи, в которых есть node, а также, когда я делаю -(pmid:*), он показалвсе документы, а не только документы, в которых нет node.

Возможно ли даже с fields, что я пытаюсь сделать?

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

В API поиска для поиска с использованием подстановочных знаков используются запросы слова или значения, а не запросы диапазона:

http://docs.marklogic.com/guide/search-dev/wildcard#id_74842

Сервер поддерживает сопоставление с шаблоном для значений в индексе диапазона, но это не отражено в синтаксисе текста запроса API поиска:

http://docs.marklogic.com/cts.valueMatch

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

Один из подходов заключается в использовании cts: json-property-scope-query () (или cts: element-query () при поиске в XML) с помощью cts: true-query () или cts:false-query () в качестве подзапроса, например:

cts:json-property-scope-query("pmidPropertyKey", cts:true-query())

Вы можете установить пользовательское ограничение, которое принимает текст запроса pmid: true или pmid: false и выполняет соответствующий cts: json-property-scope-query ()

Для получения дополнительной информации см .:

http://docs.marklogic.com/cts:json-property-scope-query

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

0 голосов
/ 26 апреля 2019

Не знаю, почему это не работает, но у меня есть обходной путь для вас. Я добавил контейнер с именем * в ограничение диапазона, который выбирает все, что больше, например, пустую строку (это все, что я думаю).

xquery version "1.0-ml";

xdmp:document-insert('test.xml', <doc><test>hello world</test></doc>);
xdmp:document-insert('test2.xml', <doc><test>hello world 2</test></doc>);
xdmp:document-insert('test3.xml', <doc><test></test></doc>);
xdmp:document-insert('test4.xml', <doc></doc>);

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="test">
       <range type="xs:string">
            <field name="test"/>
            <bucket ge="" name="*"></bucket>
       </range>
   </constraint>
   <term>
        <term-option>case-insensitive</term-option>
        <term-option>punctuation-insensitive</term-option>
        <term-option>whitespace-insensitive</term-option>
        <term-option>wildcarded</term-option>
   </term>
   <transform-results apply="empty-snippet"/>
</options>

return search:search("test:*", $options)

Возвращает test.xml, test2.xml и test3.xml, которые имеют элемент test.

При поиске "-(test:*)" возвращает только test4.xml, который является единственным документом, в котором нет элемента test.

Другим вариантом может быть использование опции дополнительный запрос для добавления сериализованного запроса cts, который выбирает документы [не], содержащие ваш элемент. Это было бы более чистым решением в моих глазах, поскольку ведро кажется немного хакерским.

...