Объединение XPath и поисковых запросов - PullRequest
1 голос
/ 03 июня 2019

Требование:

Объединение запроса cts/search с запросом XPath.XPath - это неизвестная строка ввода пользователя.

Функция search:resolve принимает «Объект cts: запрос, сериализованный запрос cts: или структурированный запрос (search: query)».( Источник )

Вопрос:

Есть ли API для преобразования XPath в cts или структурированный запрос, чтобы я мог объединить XPathи другие поисковые запросы?

Неработающий пример:

xquery version "1.0-ml";
let $doc := 
  <test>
    <name>Mike</name>
    <age>20</age>
  </test>
return xdmp:document-insert('mike.xml', $doc);

import module namespace search = "http://marklogic.com/appservices/search"
    at "/MarkLogic/appservices/search/search.xqy";

let $xpath := '/test[name="Mike"]'
let $cts-query := cts:and-query(
   xpathToCts($xpath), (: Somehow convert XPath to cts query here :)
   cts:element-value-query(xs:QName("age"), "20")
)

return search:resolve($cts-query)

Если в настоящее время нет способа преобразовать строку XPath в search совместимый формат, есть ли другой способ объединитьXPath и cts / поисковые запросы?

Любая помощь будет принята с благодарностью!

Обновление 1 :

Я попытался использовать предложенную опцию searchable-expression, но столкнуться с другой проблемой, объединяющей его с extract-document-data:

import module namespace search = "http://marklogic.com/appservices/search"
    at "/MarkLogic/appservices/search/search.xqy";

search:resolve(
  cts:element-value-query(xs:QName("name"), "Mike"),
  <options xmlns="http://marklogic.com/appservices/search">
    <searchable-expression>/test[age = 20]</searchable-expression>
    <extract-document-data>
      <extract-path>/test/name</extract-path>
    </extract-document-data>
  </options>
)

Этот запрос возвращает следующие извлеченные данные:

<search:extracted-none>
</search:extracted-none>

Хотя без выражения для поиска я получаю ожидаемое:

<search:extracted kind="element">
   <name>Mike</name>
</search:extracted>

Если я не ошибаюсь, выражение для поиска ведет себя так же, как и первый параметр cts:search.Читая документы, он говорит:

Например, если вы укажете // p, тогда будут возвращены элементы p, соответствующие критериям поиска.

Таким образом, получающиеся узлыограничено поисковым выражением и всеми узлами ниже, что не то, что я хочу.

1 Ответ

2 голосов
/ 03 июня 2019

Вы можете передать этот XPath в элемент <searchable-expression> в <search:options>, и он по существу будет AND-ed с вашим cts:query.Под капотом все выражения XPath преобразуются в оптимизированные планы запросов, подобно cts:queries (за исключением того, что выражения XPath всегда будут фильтроваться, чтобы предотвратить возврат ложных срабатываний, тогда как фильтрация с выражениями cts необязательна).

Но я должен отметить, что оценка пользователя XPath чрезвычайно опасна, и если ее не проверять, это огромная дыра для инъекционных атак.Вы должны проверить или санировать запрос, чтобы предотвратить это и / или убедиться, что запрос не может запускать обновления, например: /x/y/z[xdmp:directory-delete('/')].Что-то вроде этого в верхней части вашего запроса - хорошее начало: declare option xdmp:update "false";

...