После нескольких поисков и прочтений я решил обобщить свои выводы.
Примечание : Если вы не используете фрагментацию, каждое использование «фрагмента» может быть сопоставлено с «документом».
Частично против полного плана
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. Это покрывает большую часть моих вопросов, и я действительно могу рекомендовать это.