Невозможно найти документацию по xdmp: план результатов - PullRequest
0 голосов
/ 27 октября 2018

Мне трудно найти подробности о том, что означает вывод xdmp:plan.

Имея простой запрос, подобный этому:

xdmp:plan(cts:search(doc(), cts:element-value-query(xs:QName("description"), "some text")))

приводит к довольно длинному плану выполнения:

<qry:query-plan xmlns:qry="http://marklogic.com/cts/query">
<qry:expr-trace>...</qry:expr-trace>
...
<qry:partial-plan>
  <qry:term-query weight="1">
      <qry:key>16037778974159125508</qry:key>
      <qry:annotation>element(description,value("some","text"))</qry:annotation>
  </qry:term-query>
</qry:partial-plan>
...
<qry:ordering></qry:ordering>
<qry:final-plan>
  <qry:and-query>
    <qry:term-query weight="1">
      <qry:key>16037778974159125508</qry:key>
      <qry:annotation>element(description,value("some","text"))</qry:annotation>
    </qry:term-query>
  </qry:and-query>
</qry:final-plan>
<qry:info-trace>Selected 0 fragments to filter</qry:info-trace>
<qry:result estimate="0"></qry:result>
</qry:query-plan>

Единственная часть документации, в которой упоминается xdmp:plan, это сама документация . Кроме этого я не могу найти ничего другого. Я хотел бы получить некоторые подробности о том, например, qry:key или qry:annotation действительно значит.

Есть ли какая-то документация, в которой я пропускаю описание возможных результатов xdmp:plan. Поскольку это действительно ценный инструмент для понимания производительности запросов, я ожидал, что он будет достаточно хорошо задокументирован.


Edit: это marklogic сообщение в блоге , которое я нашел, дает некоторые примеры того, как план запроса может быть интерпретирован.

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

У меня есть еще вопросы:

  • Какая разница между partial-plan и final-plan. Является ли final-plan слиянием всех partial-plans? Для чего и когда используется partial-plan? Частичные планы, кажется, вносят ограничения. Используются ли эти ограничения на этапе разрешения индекса для поиска идентификаторов кандидатов? Какую роль играет final-plan там? final-plan используется для фильтрации ложных срабатываний после разрешения индекса?

Иногда я могу найти это в плане запроса:

<qry:elem-word-trace text="computer" elem-name="title" elem-uri="">
   <qry:key>10975994818398622042</qry:key>
</qry:elem-word-trace>
  • Что означает qry:elem-word-trace? 1049 *
  • А как насчет <qry:ordering></qry:ordering>? В мой ответ добавлено простое описание порядка заказа.
  • Простой запрос xpath, такой как /doc[id = 1], выдает следующие 2 раз:

Есть ли причина для этого? Почему предикат 1 шага 2 дает один и тот же partial-plan дважды?

<qry:info-trace>Step 2 predicate 1 contributed 1 constraint: id = 1</qry:info-trace>
<qry:partial-plan xmlns:qry="...">...</qry:partial-plan>
<qry:info-trace>Step 2 predicate 1 contributed 1 constraint: id = 1</qry:info-trace>
<qry:partial-plan xmlns:qry="...">...</qry:partial-plan>

Ответы [ 2 ]

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

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

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

После нескольких поисков и прочтений я решил обобщить свои выводы.

Примечание : Если вы не используете фрагментацию, каждое использование «фрагмента» может быть сопоставлено с «документом».

Частично против полного плана

A partial-plan просто показывает дополнительные части плана по мере их появления и, по-видимому, в основном только для информационного использования.

С другой стороны, full-plan - это запрос о том, как он отправляется в индекс, и, следовательно, большую часть времени интересную часть.

Выбранные х фрагменты

Документация query-trace дает некоторое представление о том, что означают сообщения info-trace:

В результате запроса отфильтрованного получается info-trace, описывающий, сколько ссылок фрагментов-кандидатов было возвращено на этапе разрешения индекса обработки запроса:

xdmp:plan(cts:search(doc(), cts:element-word-query(xs:QName("title"), "computer")))
=> ...
<qry:info-trace>Selected 2 fragments to filter</qry:info-trace>

A нефильтрованный запрос регистрирует то же сообщение, но без "to filter", указывающего, что второй шаг фильтрации не выполнен:

xdmp:plan(cts:search(doc(), cts:element-word-query(xs:QName("title"), "computer"), ("unfiltered")))
=> ...
<qry:info-trace>Selected 2 fragments</qry:info-trace>

QRY: результат

<qry:result estimate="2"></qry:result>

estimate в qry:result показывает, сколько фрагментов соответствует запросу, используя только информацию индекса. Таким образом, это приблизительное число перед этапом фильтрации, поэтому может содержать ложные срабатывания. Я думаю, что значение оценки и журнал инфо-трасс, описанный выше, всегда одинаковы.


различные примеры аннотаций

Если element-word-query с включенным только word searches (fast element word searches отключено), возвращает final-plan:

xdmp:plan(cts:search(doc(), cts:element-word-query(xs:QName("title"), "computer")))
=> ...
<qry:final-plan>
   <qry:and-query>
      <qry:term-query weight="1">
         <qry:key>13967911917401594192</qry:key>
         <qry:annotation>word("computer")</qry:annotation>
      </qry:term-query>
      <qry:term-query weight="0">
         <qry:key>745773915438417736</qry:key>
         <qry:annotation>element(title)</qry:annotation>
      </qry:term-query>
   </qry:and-query>
</qry:final-plan>

Наличие двух отдельных запросов-терминов с одним word("computer") и одним element(title) означает, что он также вернет документы, содержащие слово «компьютер», за пределами элемента title. Таким образом, нефильтрованный поиск может возвращать ложные срабатывания.

Если включено element-word-query с и word searches и fast element word searches, то возвращается final-plan:

<qry:final-plan>
   <qry:and-query>
      <qry:term-query weight="1">
         <qry:key>10975994818398622042</qry:key>
         <qry:annotation>element(title,word("computer"))</qry:annotation>
      </qry:term-query>
   </qry:and-query>
</qry:final-plan>

Здесь annotation обозначает комбинированный поиск слова «компьютер» внутри элемента title. Этот запрос может быть не отфильтрован и по-прежнему не давать ложных срабатываний в моем случае.

Более подробная информация в этом блоге .


QRY: заказ

Этот тег <qry:ordering> указывает, что результирующие ссылки на фрагменты кандидатов упорядочены. Это можно контролировать с помощью одного из конструкторов cts: order в функции cts: search . Пример: * 1 083 *

xdmp:plan(
  cts:search(
    doc(), 
    cts:element-word-query(xs:QName("title"), "computer"), 
    (cts:unordered())
))
=>....
<qry:ordering>
    <qry:unordered></qry:unordered>
</qry:ordering>

Как посмотреть, используется ли индекс

Мне всегда было интересно, как узнать, используется ли индекс или нет (используется для запроса планов выполнения, когда у вас есть полное сканирование индекса). В конечном итоге вы можете легко определить, используется индекс или нет:

Поиск <qry:info-trace> журналов, которые содержат searchable. Сообщения, содержащие searchable, хороши, это означает, что эта часть вашего запроса может быть выполнена с использованием индекса. Если оно содержит слово unsearchable, это может быть плохим знаком.

Сообщение журнала для xdmp:plan(//image/id[. = "1"]/..) может выглядеть следующим образом:

<qry:info-trace>Analyzing path: fn:collection()/descendant::image/id[. = "1"]/..</qry:info-trace>
<qry:info-trace>Step 1 is searchable: fn:collection()</qry:info-trace>
<qry:info-trace>Step 2 is searchable: descendant::image</qry:info-trace>
<qry:info-trace>Step 3 is searchable: id[. = "1"]</qry:info-trace>
<qry:info-trace>Step 4 axis is unsearchable: parent</qry:info-trace>
<qry:info-trace>Step 4 is unsearchable: ..</qry:info-trace>

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

Этот слегка измененный запрос может использовать индекс для всех "шагов" xdmp:plan(//image[id = "1"]);

<qry:info-trace>Analyzing path: fn:collection()/descendant::image[id = "1"]</qry:info-trace>
<qry:info-trace>Step 1 is searchable: fn:collection()</qry:info-trace>
<qry:info-trace>Step 2 is searchable: descendant::image[id = "1"]</qry:info-trace>
<qry:info-trace>Path is fully searchable.</qry:info-trace>

Более подробную информацию можно найти здесь .


Если кто-то найдет больше информации о том, как интерпретировать и работать с выводом xmdp:plan, я буду рад узнать об этом.

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

Нашел это действительно интересное видео , где Мэри Хольстег рассказывает о поиске и индексах MarkLogic. Это покрывает большую часть моих вопросов, и я действительно могу рекомендовать это.

...